为什么@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
相关产品推荐
相关产品推荐

