为什么我可以将@objc协议声明为弱属性,而不是快速协议?

时间:2016-09-14 07:01:08

标签: swift protocols weak-references

我发现如果我创建了这样的协议:

protocol MyProtocol { }

我不能这样做:

weak var myVar: MyProtocol?

我找到了解决这个问题的方法,即在协议声明中添加@objc

@objc protocol MyProtocol { }

但为什么这可以修复错误?

我的猜测是添加@objc会阻止结构符合协议,因此将变量的值设为参考类型。我是对的吗?

此外,添加@objc会阻止我添加像[String: Any]这样的快速类型。我还想知道是否有另一种修复错误的方法。

1 个答案:

答案 0 :(得分:4)

只能为引用类型创建弱引用,即实例 一个类,而不是值类型(结构或枚举)。

如果您将协议声明为“仅限类协议”

protocol MyProtocol : class { }

然后您可以声明该类型的弱变量:

weak var myVar: MyProtocol?

在你的情况下

@objc protocol MyProtocol { }

声明一个只能由NSObject子类采用的协议 或其他@objc类,因此隐式只是一个类协议。