为什么 swift 不允许我创建协议类型字段?



据我所知,结构是一种值类型,它将所有字段存储在连续内存段附近,其大小应该在编译时知道。所以,正如我所认为的,由于对某个对象的引用的大小是恒定的,编译这段代码应该没有问题:

struct Some {
weak var delegate: SomeDelegate?
}
protocol SomeDelegate {
...some functions...
}

所以结构体'Some'将只有一个32或64位大小的字段(我认为它应该是怎样的)。但是swift编译器对这些行发出错误并说:

"'weak'不能应用于非类绑定的'any SomeDelegate';考虑添加一个具有类边界的协议一致性。当然,我可以用泛型或相关类型来完成这项任务,但是为什么"weak"不能应用于非类绑定的"任意SomeDelegate"呢?

如果您的协议符合AnyObject,则可以将weak与协议一起使用

struct Some {
weak var delegate: (any SomeDelegate)?
}
protocol SomeDelegate: AnyObject {
...
}

Weak (reference)只能用于引用类型。结构和枚举是值类型,类是引用类型。

这就是为什么协议必须是仅类(AnyObject)协议

最新更新