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

为什么@optional修饰的Objective-C协议属性在Swift中无法赋值?

问题原因解析
  • 首先,Objective-C 中标记为@optional的协议成员,桥接到 Swift 时会被处理为可选要求:也就是说遵循Playback协议的类,可以选择不实现assetURL属性的 getter 和 setter。
  • 当assetURL是必选要求(去掉@optional)时,Swift 可以确认所有遵循Playback协议的类都必然实现了这个属性的读写方法,加上Playback是继承自NSObjectProtocol的类专用协议(只能被类遵循),所以可以直接对any Playback类型实例的该属性赋值,编译正常。
  • 当assetURL是可选要求时,Swift 无法默认假设当前currentPlayerManager实例实现了该属性的 setter。直接写pla.assetURL = xxx的写法,会被 Swift 判定为试图修改pla这个协议存在容器本身的值,触发不可变报错。
  • 这种场景如果不想去掉@optional,可以用可选链明确触发可选 setter 的调用即可,修改为以下代码就能正常编译:
pla.assetURL? = URL(string: "123")

内容的提问来源于stack exchange,提问作者Rakuyo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:15:05