为什么我可以将 @objc 协议声明为弱属性,但不能将 Swift 协议声明为弱属性?

4

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

protocol MyProtocol { }

我无法做到这一点:


weak var myVar: MyProtocol?

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

@objc protocol MyProtocol { }

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

我猜测添加@objc可以避免结构体符合协议,因此变量的值保证是引用类型。我猜对了吗?

此外,添加@objc也会阻止我添加像[String: Any]这样的Swift类型。我还想知道是否有其他方法来修复这个错误。

1个回答

4

弱引用只能用于引用类型,也就是类的实例,而不是值类型(结构体或枚举)。

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

protocol MyProtocol : class { }

然后,您可以声明该类型的一个弱变量:
weak var myVar: MyProtocol?

在您的情况下
@objc protocol MyProtocol { }

声明了一个协议,只能由NSObject子类或其他@objc类采用, 因此它隐含地是一个仅限类的协议。


所以我的猜测是正确的!我从来不知道 @objc 协议只能被 NSObject 的子类采用!谢谢! - Sweeper
@Sweeper:严格来说,它可以被NSObject的子类或其他@objc类所采用,但现在请不要问我具体的区别 :) - Martin R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接