'Protocol' 类型的值没有成员 'Function'

Value of type 'Protocol' has no member 'Function'

在下面的代码中,当我尝试访问 genericVar.someFunc() 时出现错误

"Value of type 'MyProtocol?' has no member 'someFunc'".

作为一个通用变量,当我初始化 MyOtherStruct 对象时,我将不得不传递一个 MyProtocol 符合对象的具体实现,那么为什么我会收到这个错误?

public protocol MyProtocol {

    associatedtype T
    func someFunc() -> T
}

public struct myStruct: MyProtocol {
    public typealias T = Int16

    public func someFunc() -> Int16 {
        let myVar: Int16 = 7
        return myVar
    }
}

public struct myOtherStruct<MyProtocol> {

    var genericVar: MyProtocol?

    public init(localVal: MyProtocol?) {
        self.genericVar = localVal
        if genericVar != nil {
            var my = genericVar.someFunc()
        }
    }
}

你的泛型类型声明是错误的。括号中的 MyProtocol 是泛型类型参数的名称,而不是实际的协议。您需要为泛型类型参数声明另一个名称并将其约束为 MyProtocol,如下所示:struct MyOtherStruct<T:MyProtocol>。这里 T 将是结构的泛型类型参数,:MyProtocol 语法强制 T 符合 myProtocol.

public struct MyOtherStruct<T:MyProtocol> {
    var genericVar: T?

    public init(localVal: T?) {
        self.genericVar = localVal
        if let genericVar = genericVar {
            let my = genericVar.someFunc()
        }
    }
}

其他一些需要考虑的事情:你应该遵守 Swift 命名约定,对于类型来说是大驼峰命名,当你想访问 Optional 值上的 property/method 时,而不是做一个nil 比较像 if genericVar != nil 你应该使用 if let 的可选绑定。