类型为“协议”的值没有成员“函数”

时间:2019-08-11 12:37:51

标签: swift swift-protocols

在下面的代码中,当我尝试访问genericVar.someFunc()时收到错误消息

  

“类型为'MyProtocol?的值?没有成员“ 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()
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您的通用类型声明是错误的。括号中的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命名约定,即类型的UpperCamelCase,并且要访问Optional值上的属性/方法时,不要像进行nil这样的比较{1}},您应该使用if genericVar != nil使用可选绑定。