【发布时间】:2022-01-11 08:07:18
【问题描述】:
我有一个 Objective-C 协议,其中包含如下属性:
#import <Foundation/Foundation.h>
@protocol Playback <NSObject>
@optional
@property (nonatomic, nonnull) NSURL *assetURL;
@end
PlayerController 有一个id<Playback> 类型的属性:
@interface PlayerController: NSObject
@property (nonatomic, strong, nonnull) id<Playback> currentPlayerManager;
@end
我尝试在 Swift 中编写以下代码,但出现错误:
var player = PlayerController()
var pla = player.currentPlayerManager
pla.assetURL = URL(string: "123") // ❌ Cannot assign to property: 'pla' is immutable
如果我为Playback 协议注释掉@optional,那么它编译得很好。
这让我想知道为什么@optional 会导致这个错误?
【问题讨论】:
-
这实际上可能值得在Swift forums 上询问,在那里您可能会得到从事编译器工作的人来插话。这似乎是一个非常小众的边缘案例,其编译器诊断是也不是特别有帮助;这可能是一个无法编译的错误(这在 Obj-C 中确实有效),或者至少可以优化消息。 FWIW,您可以在纯 Swift 中定义完全相同的协议 + 属性(使用
@objc注释以允许optional var),您将看到相同的行为。 -
另一个问题是 URL 和 NSURL 之间的类型不匹配。
-
@ItaiFerber 我也想在 Swift 论坛上问一个问题,但很遗憾,由于某些客观原因,我无法访问该站点...
-
@ItaiFerber 如果您能帮助我,将不胜感激,您可以在有明确结论时给我发送电子邮件或在此问题下回复我。这可能需要您花费一些时间,但如果您没有时间,那就直接问我吧,只要这个问题能帮助更多的人,我会很高兴。
-
@Rakuyo 绝对。我会在论坛上提问并在此处转发(希望是确定的)回复。
标签: swift objective-c objective-c-swift-bridge objective-c-protocol