You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 04:46:14