如何在两个协议之间共享关联类型?

时间:2016-11-02 18:56:25

标签: ios swift associated-types

我需要声明两个协议,它们都有关联类型:

protocol MyView {
  associatedtype DataType
  associatedtype LayoutType : MyLayout

  var data: DataType { get }
  var layout: LayoutType { get }

  func doLayout()
}

protocol MyLayout {
  associatedtype DataType

  func computeLayout(with data: DataType?)
}

使用此当前协议定义,associatedtype DataType的{​​{1}}与MyView中的MyLayout实际上并不相同:

extension MyView {
  func doLayout() {
    layout.computeLayout(with: self.data)
                               ^^^^^^^^^
    Cannot convert value of type 'Self.DataType' to expected argument type '_?'
  }
}

编译器告诉我们类型不一样。

有没有办法在两个协议之间共享关联类型来解决我的问题?感谢。

1 个答案:

答案 0 :(得分:2)

问题在于,MyView的实施可能会使LayoutTypeDataType具有不同的DataType associatedtype LayoutType : MyLayout where LayoutType.DataType == DataType 。实施SE-0142: Permit where clauses to constrain associated types后,您就可以说:

LayoutType

为了强制合规类型必须具有匹配DataType的{​​{1}}。

然而,在这种情况发生之前,您可能做的最好的事情就是将约束添加到扩展名 - 这只会使doLayout()的默认实现可用{{1}匹配。

DataType