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

ars1skjm  于 2022-12-26  发布在  Swift
关注(0)|答案(1)|浏览(109)

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

struct Some {
    weak var delegate: SomeDelegate?
}

protocol SomeDelegate {
    ...some functions...
}

所以struct 'Some'只有一个32位或64位的字段(我认为应该是这样的),但是swift编译器会对这几行代码发出一个错误消息:
“'weak'不能应用于非类绑定的'any SomeDelegate';考虑添加具有类绑定的协议一致性”当然,我可以使用泛型或关联类型完成此任务,但为什么“'weak'不能应用于非类绑定的'any SomeDelegate'”?

mklgxw1f

mklgxw1f1#

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

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

protocol SomeDelegate: AnyObject {
    ...
}

Weak(reference)只能用于引用类型。结构和枚举是值类型,类是引用类型。
这就是协议必须是仅类(AnyObject)协议的原因

相关问题