Set <self>类型的Swift协议属性

时间:2017-06-19 11:10:59

标签: swift swift-protocols

我试图创建简单的协议:

protocol Groupable
{
    var parent: Self? { get }
    var children: Set<Self> { get }
}

children属性无法编译,因为:Type 'Self' does not conform to protocol 'Hashable'

有没有办法确保Self成为Hashable?或者其他任何解决方法,例如使用associatedtype

2 个答案:

答案 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()