Lý do ngay lập tức khiến bạn không thể làm những gì bạn muốn làm là Hashable là giao thức chung. Do đó nó - hoặc một giao thức xuất phát từ nó - không thể được sử dụng làm kiểu phần tử của Set. Một kiểu generic có thể chỉ được sử dụng như một ràng buộc trong một generic khác. Bạn sẽ nhận thấy rằng bạn cũng không thể khai báo một số Set<Hashable>
, mặc dù loại phần tử của một bộ phải là tuân theo để có thể băm.
Cách tiếp cận đơn giản nhất là tạo, không phải là một tập hợp các giao thức, mà là một tập hợp một số loại đối tượng. Ví dụ, nếu S là một cấu trúc mà phù hợp với CustomProtocol (vì nó phù hợp với Hashable cộng bất cứ điều gì khác CustomProtocol đòi hỏi), bạn có thể khai báo một bộ S.
Ví dụ:
protocol CustomProtocol: Hashable {
}
func ==(lhs:S,rhs:S) -> Bool {
return lhs.name == rhs.name
}
struct S : CustomProtocol {
var name : String
var hashValue : Int { return name.hashValue }
}
let set = Set<S>()
Nếu vấn đề bạn đang cố gắng giải quyết là bạn muốn có một tập hợp các kiểu hỗn hợp, tuy nhiên theo cách nào đó tương đương với nhau, thì đó chính là vấn đề được giải quyết bởi các phần mở rộng giao thức, như được giải thích trong phần thảo luận trong video định hướng WWDC 2015 .
Nhưng nó sẽ đơn giản hơn để làm cho tất cả các loại lớp học của bạn bắt nguồn từ NSObject. Bạn vẫn có thể làm cho chúng chấp nhận một số giao thức thứ cấp, tất nhiên, nhưng tập sẽ không được định nghĩa là một tập hợp của giao thức đó mà là của NSObject.
Đối tượng trong đã được yêu cầu để tuân theo Hashable. – Abizern
Nếu CustomProtocol không tuân theo Hashable, Xcode phàn nàn về CustomProtocol không phù hợp với nó. Có vẻ như tôi đang thiếu thứ gì đó. –