为什么我可以将 @objc 协议声明为弱属性,而不是 swift 协议?
Why can I declare @objc protocols as weak properties, but not swift protocols?
我发现如果我创建这样的协议:
protocol MyProtocol { }
我做不到:
weak var myVar: MyProtocol?
我找到了解决这个问题的方法,就是在协议声明中添加 @objc
:
@objc protocol MyProtocol { }
但是为什么这样可以修复错误呢?
我的猜测是添加 @objc
会阻止结构符合协议,因此变量的值保证是引用类型。我说得对吗?
此外,添加 @objc
会阻止我添加 swift 类型,例如 [String: Any]
。我也想知道有没有其他方法可以修复这个错误。
只能为引用类型创建弱引用,即实例
class,不适用于值类型(结构或枚举)。
如果您将协议声明为 "class-only protocol"
protocol MyProtocol : class { }
那么你可以声明一个该类型的弱变量:
weak var myVar: MyProtocol?
你的情况
@objc protocol MyProtocol { }
声明一个只能被NSObject
子classes采用的协议
或其他 @objc
classes,因此这隐含地是一个 class-only 协议。
我发现如果我创建这样的协议:
protocol MyProtocol { }
我做不到:
weak var myVar: MyProtocol?
我找到了解决这个问题的方法,就是在协议声明中添加 @objc
:
@objc protocol MyProtocol { }
但是为什么这样可以修复错误呢?
我的猜测是添加 @objc
会阻止结构符合协议,因此变量的值保证是引用类型。我说得对吗?
此外,添加 @objc
会阻止我添加 swift 类型,例如 [String: Any]
。我也想知道有没有其他方法可以修复这个错误。
只能为引用类型创建弱引用,即实例 class,不适用于值类型(结构或枚举)。
如果您将协议声明为 "class-only protocol"
protocol MyProtocol : class { }
那么你可以声明一个该类型的弱变量:
weak var myVar: MyProtocol?
你的情况
@objc protocol MyProtocol { }
声明一个只能被NSObject
子classes采用的协议
或其他 @objc
classes,因此这隐含地是一个 class-only 协议。