我需要声明两个协议,它们都有关联类型:
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 '_?'
}
}
编译器告诉我们类型不一样。
有没有办法在两个协议之间共享关联类型来解决我的问题?感谢。
答案 0 :(得分:2)
问题在于,MyView
的实施可能会使LayoutType
与DataType
具有不同的DataType
associatedtype LayoutType : MyLayout where LayoutType.DataType == DataType
。实施SE-0142: Permit where clauses to constrain associated types后,您就可以说:
LayoutType
为了强制合规类型必须具有匹配DataType
的{{1}}。
然而,在这种情况发生之前,您可能做的最好的事情就是将约束添加到扩展名 - 这只会使doLayout()
的默认实现可用{{1}匹配。
DataType