为什么我可以将 @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 协议。