我在Objective-C中定义了一个类,该类的初始化程序是-initWithError:
(初始化程序可能由于对外部资源的依赖而失败)。我希望这能桥接到Swift init() throws
。从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
。显而易见的解决方案是标记-init
使用NS_UNAVAILABLE
在Objective-C的头部。不幸的是,这行不通。-initWithError:
仍然被桥接为init(error: ())
,尝试调用会try Foo()
导致编译器错误,指出init()
在Swift中不可用。
有没有更优雅的解决方案,以便可以try init()
正常工作?
您可以使用来重命名该功能NS_SWIFT_NAME
。在这种情况下:
- (instancetype _Nullable)initWithError:(NSError **)error NS_SWIFT_NAME(init());
也就是说,这就像编译器错误一样。我建议打开一个缺陷。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句