不理解“成员 '<func>' 不能用于类型 'any <type>' 的值;请考虑使用通用约束”错误

vag*_*ant 10 generics swift swift-protocols

我无法完全掌握协议和泛型的问题。

在下面的代码中,用 ERROR HERE 注释标记,我收到以下错误:

成员“protocolMethod”不能用于“any Protocol1”类型的值;考虑使用通用约束来代替

我认为它抱怨主要是因为参数的类型item至少在某种程度上未解决?不幸的是,我发现这个建议没有帮助,因为我不知道通用约束在这里有何帮助(至少就我对它们的理解而言)。

老实说,我觉得我可能对 Swift 要求太多了。

有人可能会看到问题是什么或有尝试解决此问题的建议吗?

添加于 12/26/22 - 作为进一步的背景,导致错误出现的原因是将参数添加itemprotocolMethod协议上的方法中,这几乎表明它是问题的核心。

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)

And*_*ver 9

你会得到这个错误,因为当你写:

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)