有一个协议和泛型的问题,我只是不能完全得到一个处理。
在下面的代码中,标记为ERROR HERE注解,我得到了以下错误:
不能对类型为“any Protocol 1”的值使用成员“protocolMethod”;请考虑改用一般约束
我假设它抱怨的主要原因是item
参数的类型至少在某种程度上是未解决的?不幸的是,我没有发现这个建议有帮助,因为我不知道泛型约束在这里会有什么帮助(至少对我的理解是这样)。
老实说,我有点觉得我可能只是要求太多的斯威夫特在这里。
有人可能看到问题是什么或有什么建议,试图解决这个问题?
2022年12月26日添加-作为进一步的背景,导致错误出现的原因是将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)
1条答案
按热度按时间dgiusagp1#
出现此错误是因为当您写入以下内容时:
你不需要告诉编译器
DataItem
是什么,它可以是任何东西,在你的Class1
实现中应该没有关系。但当你写:
您试图将
Type1.AType1
类型的对象作为需要DataItem
的方法的参数传递,由于委托可以是any Protocol1
,因此无法保证它们相同。错误消息实际上提出了一个解决方案:
不能对类型为"any Protocol1"的值使用成员"protocolMethod";* * 请考虑改用一般约束**
您可以向
Class1
添加另一个类型参数,并添加一个泛型约束,以告诉编译器AType1
和DataItem
需要相等: