我无法完全处理的协议和泛型问题。
在下面的代码中,标记为 ERROR HERE 注释,我收到以下错误:
成员“protocolMethod”不能用于“any Protocol1”类型的值;考虑改用通用约束
我假设它抱怨主要是因为
item
参数的类型至少在某种程度上没有得到解决?不幸的是,我没有发现这个建议有帮助,因为我看不到通用约束在这里有什么帮助(至少我对它们的理解)。
老实说,我觉得我可能对 Swift 的要求太多了。
有人可能看到问题是什么或有尝试解决这个问题的建议吗?
添加 12/26/22 - 作为进一步的背景,导致错误出现的原因是将
item
参数添加到协议上的 protocolMethod
方法,这几乎表明它是问题的核心。
protocol Protocol1
{
associatedtype DataItem
func protocolMethod(item : DataItem)
}
protocol Protocol2 {
associatedtype AType1: Hashable
//...
}
class Class1<Type1: Protocol2>: NSObject
{
typealias Item = Type1.AType1
var delegate : (any Protocol1)?
private func method1(item: Item)
{
delegate?.protocolMethod(item : item) //ERROR HERE
}
}
(使用最新的 Xcode)
你得到这个错误是因为当你写:
var delegate : (any Protocol1)?
您不向编译器提供有关
DataItem
是什么的任何信息。它可以是任何东西,在您的 Class1
实施中应该无关紧要。
但是当你写:
private func method1(item: Item)
{
delegate?.protocolMethod(item : item) //ERROR HERE
}
您正在尝试将类型为
Type1.AType1
的对象作为需要 DataItem
的方法的参数传递,并且由于委托可以是 any Protocol1
您无法保证它们相同。
报错信息其实提出了解决方案:
成员“protocolMethod”不能用于“any Protocol1”类型的值; 考虑改用通用约束
您可以将另一个类型参数添加到
Class1
并添加一个通用约束来告诉编译器 AType1
和 DataItem
需要相等:
class Class1<Type1: Protocol1, Type2: Protocol2>: NSObject where Type1.DataItem == Type2.AType1
{
typealias Item = Type2.AType1
var delegate : Type1?
private func method1(item: Item)
{
delegate?.protocolMethod(item : item)
}
}