我试图创建简单的协议:
protocol Groupable
{
var parent: Self? { get }
var children: Set<Self> { get }
}
但children
属性无法编译,因为:Type 'Self' does not conform to protocol 'Hashable'
。
有没有办法确保Self
成为Hashable
?或者其他任何解决方法,例如使用associatedtype
?
答案 0 :(得分:1)
在协议中设置约束的方式与指定协议一致性的方式类似(毕竟它们是相同的)
protocol Groupable: Hashable
{
var parent: Self? { get }
var children: Set<Self> { get }
}
答案 1 :(得分:1)
您需要使用协议继承:
协议可以继承一个或多个其他协议,并可以在其继承的需求之上添加更多要求。协议继承的语法类似于类继承的语法,但可以选择列出多个继承的协议,用逗号分隔。
通过继承Hashable,您的类将需要符合此协议。 另外,在您的具体示例中,您需要让您的课程成为最终成绩。有关说明,请参阅A Swift protocol requirement that can only be satisfied by using a final class
以下是一个例子:
protocol Groupable: Hashable {
var parent: Self? { get }
var children: Set<Self> { get }
}
final class MyGroup: Groupable {
var parent: MyGroup?
var children = Set<MyGroup>()
init() {
}
var hashValue: Int {
return 0
}
}
func ==(lhs: MyGroup, rhs: MyGroup) -> Bool {
return true
}
let a = MyGroup()