为何Swift不允许结构体使用无类绑定的protocol类型weak属性?
问题原因解析
首先,weak关键字的核心作用是配合ARC(自动引用计数)管理类实例的引用,它的存在前提是被修饰的对象必须是类类型——因为只有类类型才有引用计数,值类型(结构体、枚举)是通过复制传递的,根本不存在“引用计数”和“循环引用”的问题,weak对值类型完全无效。
你写的SomeDelegate协议没有添加类约束,这意味着它既可以被类实现,也可以被结构体、枚举等值类型实现。编译器看到你用weak修饰any SomeDelegate?时,会意识到这个变量可能指向一个值类型实例,而weak无法作用于值类型,所以直接报错阻止这种无效操作。
你误以为“引用大小固定”就可以用weak,但问题的关键不是内存大小,而是weak的适用范围:它只能绑定到类类型的引用上。
修正方案
最简单的方式是给协议添加类约束,确保它只能被类遵守:
protocol SomeDelegate: AnyObject { // ...some functions... } struct Some { weak var delegate: SomeDelegate? }
这样编译器就明确delegate只能是类实例的引用,weak修饰就合法了。
你提到的泛型方式也可行,本质是通过泛型约束限定类型为类:
struct Some<T: SomeDelegate & AnyObject> { weak var delegate: T? }
内容的提问来源于stack exchange,提问作者Maxim Zenkov
相关产品推荐
相关产品推荐

