Swift泛型协议弱属性报错:'weak'仅适用于类绑定协议类型
这不是Swift的Bug,而是类型系统的预期约束
先给你吃个定心丸:你遇到的这个情况并不是Swift的Bug,而是编译器在类型安全上的正常检查逻辑~
你看到的报错核心原因很明确:Swift的weak修饰符只能用于类类型,或者被明确标记为「类绑定」的协议。而你定义的CoordinatingDelegate虽然继承了NSObjectProtocol,但它本身并没有被限制为只能被类遵循——也就是说,理论上结构体、枚举这类值类型也可以去实现这个协议。
你的关联类型GenericCoordinatingDelegate只是被约束为遵循CoordinatingDelegate,编译器没办法提前确定它最终会被类类型还是值类型填充,自然不允许你用weak修饰这个属性(毕竟值类型根本不存在引用计数,weak对它们毫无意义)。
解决方法:把协议改为类绑定协议
只需要在定义CoordinatingDelegate的时候,加上AnyObject约束,明确这个协议只能被类类型遵循,这样编译器就能确定关联类型一定是类类型,weak修饰符就合法了:
protocol Coordinated { associatedtype GenericCoordinatingDelegate: CoordinatingDelegate weak var coordinatingDelegate: GenericCoordinatingDelegate? { get set } } // 加上: AnyObject,把协议标记为类绑定 protocol CoordinatingDelegate: NSObjectProtocol, AnyObject { }
这样修改后,Xcode的报错就会消失啦。
内容的提问来源于stack exchange,提问作者Jacob King
相关产品推荐
相关产品推荐

