'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
的可选绑定。
在下面的代码中,当我尝试访问 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
的可选绑定。