2016-08-30 31 views
5

Tôi đã cố gắng tạo một đặt trong số mảng để tạo các phần tử độc đáo. Tôi nghĩ rằng nó sẽ là một cách tiếp cận thanh lịch để sử dụng bộ khởi tạo để thực hiện công việc này. Vì vậy, tôi đã tạo một mảng và cố gắng khởi tạo đặt mới bằng cách sử dụng mảng đó. Nhưng trình biên dịch đã phàn nàn. Tôi đã thử nó bằng cách sử dụng các giá trị Integer và nó hoạt động giống như một sự quyến rũ. Nhưng với lớp học của riêng tôi nó không hoạt động. Tôi cũng nghĩ rằng Equatable Protocol là đúng cách để đi .. nhưng như bạn thấy, nó không giải quyết được vấn đề của tôi.Tạo Bộ Mảng trong Swift

Hãy xem xét những sân chơi như sau:

import UIKit 

internal struct Object: Equatable { 
    var a: Int 
} 

internal func == (lhs:Object,rhs: Object) -> Bool { 
    return lhs.a == rhs.a 
} 

let array = [Object(a:1),Object(a:1),Object(a:1),Object(a:1),Object(a:2)] 

let set = Set(array) // ERROR 

Các trình biên dịch được phàn nàn với

không thể gọi initializer Đặt < _> với đối số kiểu [Object]

Mà Nghị định thư tôi có cần phải thực hiện để làm cho mọi thứ hoạt động không?

+5

'Object' phải phù hợp cho 'Hashable', không chỉ' Equatable'. –

+0

Có thể trùng lặp của [Giảm mảng để thiết lập trong Swift] (http://stackoverflow.com/questions/34161786/reduce-array-to-set-in-swift) – EmilioPelaez

+0

Nó không phải là một bản sao, tôi rõ ràng hỏi về loại giao thức tôi cần thực hiện. Chuỗi được tham chiếu không nói gì về Giao thức Hashable và bao gồm các cấu trúc bằng cách sử dụng lệnh giảm, điều này có thể khiến nhà phát triển đưa ra giải pháp sai. Bài đăng này chính xác hơn và không được đánh dấu là trùng lặp để giúp người dùng tràn ngăn xếp khác tìm ra giải pháp cho vấn đề của họ nhanh hơn. –

Trả lời

8

Nếu bạn 'nhấp chuột' trên Set trong Xcode, nó sẽ đưa bạn đến định nghĩa loại Set. Và có bạn đi:

/// A collection of unique `Element` instances with no defined ordering. 
public struct Set<Element : Hashable> : Hashable, CollectionType ... 

Như đã đề cập bởi Rob các yếu tố cần phải xác nhận để Hashable (do đó đòi hỏi Equatable).

Điều chỉnh mã của bạn:

import Foundation 

internal struct Object: Hashable { 
    var a: Int 
    var hashValue: Int { return a.hash } 
} 

internal func == (lhs:Object,rhs: Object) -> Bool { 
    return lhs.a == rhs.a 
} 

let array = [Object(a:1),Object(a:1),Object(a:1),Object(a:1),Object(a:2)] 

let set = Set(array) // SUCCESS 
Các vấn đề liên quan