How to bridge Objective-C initWithError: method into Swift

How to bridge Objective-C initWithError: method into Swift

我在 Objective-C 中定义了一个 class,其初始化程序是 -initWithError:(由于依赖外部资源,初始化程序可能会失败)。我希望它作为 init() throws 桥接到 Swift。从 NSObject 继承的常规初始化程序 -init 可以标记为不可用,因为我不想使用它。

在Objective-C中,我有:

@interface Foo : NSObject

- (instancetype _Nullable)initWithError:(NSError **)error;

@end

当然,这在 Objective-C 中工作正常。

在 Swift 中,-initWithError 桥接为 init(error: ()) throws。这大概是因为从方法名称中删除 withError: 会导致 init() 与继承的普通 -init 初始化程序冲突。这可以从 Swift 中调用,如下所示:

let foo = try Foo(error: ())

这看起来很奇怪,因为错误参数是无效的。如果将其导入为 init() throws 肯定会更好。显而易见的解决方案是在 Objective-C header 中使用 NS_UNAVAILABLE 标记 -init。不幸的是,这不起作用。 -initWithError: 仍然被桥接为 init(error: ()),并且尝试调用 try Foo() 导致编译器错误,指出 init() 在 Swift.

中不可用

是否有更优雅的解决方案,以便 try init() 正常工作?

您可以使用 NS_SWIFT_NAME 重命名函数。在这种情况下:

- (instancetype _Nullable)initWithError:(NSError **)error NS_SWIFT_NAME(init());

也就是说,这感觉像是一个编译器错误。我建议打开 defect.