gpt4 book ai didi

ios - 如何在两个协议(protocol)之间共享关联类型?

转载 作者:可可西里 更新时间:2023-11-01 01:28:07 27 4
gpt4 key购买 nike

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

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?)
}

根据当前的协议(protocol)定义,MyViewassociatedtype DataTypeMyLayout 中的并不完全相同:

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

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

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

最佳答案

问题是 MyView 的实现有可能有一个 LayoutType 和它自己的 DataType 不同的 DataType 。曾经SE-0142: Permit where clauses to constrain associated types已实现,您只需说:

associatedtype LayoutType : MyLayout where LayoutType.DataType == DataType

为了强制符合类型必须有一个 LayoutType 和匹配的 DataType

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

extension MyView where LayoutType.DataType == DataType {
func doLayout() {
layout.computeLayout(with: data)
}
}

关于ios - 如何在两个协议(protocol)之间共享关联类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40387714/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com