swift 不理解“成员"< func>不能用于类型为”any“的值< type>;请考虑改用泛型约束”错误

au9on6nz  于 2023-01-12  发布在  Swift
关注(0)|答案(1)|浏览(90)

有一个协议和泛型的问题,我只是不能完全得到一个处理。
在下面的代码中,标记为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)

dgiusagp

dgiusagp1#

出现此错误是因为当您写入以下内容时:

var delegate : (any Protocol1)?

你不需要告诉编译器DataItem是什么,它可以是任何东西,在你的Class1实现中应该没有关系。
但当你写:

private func method1(item: Item)
{
    delegate?.protocolMethod(item : item)  //ERROR HERE
}

您试图将Type1.AType1类型的对象作为需要DataItem的方法的参数传递,由于委托可以是any Protocol1,因此无法保证它们相同。
错误消息实际上提出了一个解决方案:
不能对类型为"any Protocol1"的值使用成员"protocolMethod";* * 请考虑改用一般约束**
您可以向Class1添加另一个类型参数,并添加一个泛型约束,以告诉编译器AType1DataItem需要相等:

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

相关问题