如何将Objective-C initWithError:方法桥接到Swift

时间:2018-03-26 01:42:59

标签: ios objective-c swift initialization objective-c-swift-bridge

我有一个在Objective-C中定义的类,其初始化程序为-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标头中的-init标记NS_UNAVAILABLE。不幸的是,这不起作用。 -initWithError:仍然被init(error: ())桥接,并且尝试调用try Foo()会导致编译错误,说明init()在Swift中不可用。

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

1 个答案:

答案 0 :(得分:4)

您可以使用NS_SWIFT_NAME重命名该功能。在这种情况下:

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

那就是说,这感觉就像编译错误。我建议打开defect