在下面的代码中,当我尝试访问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()
}
}
}
答案 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
使用可选绑定。