我有一个在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()
正常工作?
答案 0 :(得分:4)
您可以使用NS_SWIFT_NAME
重命名该功能。在这种情况下:
- (instancetype _Nullable)initWithError:(NSError **)error NS_SWIFT_NAME(init());
那就是说,这感觉就像编译错误。我建议打开defect。