我有一个在 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 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 .
关于ios - 如何桥接 Objective-C initWithError : method into Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49482841/