vag*_*ant 10 generics swift swift-protocols
我无法完全掌握协议和泛型的问题。
在下面的代码中,用 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
}
}
Run Code Online (Sandbox Code Playgroud)
(使用最新的Xcode)
你会得到这个错误,因为当你写:
var delegate : (any Protocol1)?
Run Code Online (Sandbox Code Playgroud)
您不向编译器提供任何有关内容的信息DataItem。它可以是任何东西,并且在您的实现中应该不重要Class1。
但是当你写:
private func method1(item: Item)
{
delegate?.protocolMethod(item : item) //ERROR HERE
}
Run Code Online (Sandbox Code Playgroud)
您试图将类型的对象Type1.AType1作为需要 a 的方法的参数传递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)
}
}
Run Code Online (Sandbox Code Playgroud)