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

问题描述 投票:0回答:1

我无法完全处理的协议和泛型问题。

在下面的代码中,标记为 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)

swift generics protocols
1个回答
1
投票

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

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) 
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.