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

为什么我可以将@objc协议声明为弱属性,而不是swift协议?,swift,protocols,weak-references,Swift,Protocols,Weak References,我发现如果我创建了这样一个协议: protocol MyProtocol { } 我不能这样做: weak var myVar: MyProtocol? 我找到了解决这个问题的方法,就是在协议声明中添加@objc: @objc protocol MyProtocol { } 但为什么这可以纠正错误呢 我的猜测是,添加@objc会阻止结构符合协议,因此变量的值需要是引用类型。我说得对吗 另外,添加@objc会阻止我添加像[String:Any]这样的swift类型。我还想知道是否有其他方法可

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

protocol MyProtocol { }
我不能这样做:

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

@objc protocol MyProtocol { }
但为什么这可以纠正错误呢

我的猜测是,添加
@objc
会阻止结构符合协议,因此变量的值需要是引用类型。我说得对吗


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

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

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

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

weak var myVar: MyProtocol?
就你而言

@objc protocol MyProtocol { }
声明只能由
NSObject
子类采用的协议
或者其他
@objc
类,因此这是一个隐式的纯类协议。

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