我在 Objective-C 中定义了一个类,它的初始化程序是-initWithError:(初始化程序可能由于对外部资源的依赖而失败)。我希望它以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. 显而易见的解决方案是在 Objective-C 标头中标记-initusing 。NS_UNAVAILABLE不幸的是,这不起作用。-initWithError:仍然被桥接为init(error: ()),并且尝试调用try Foo()会导致编译器错误,指出init()在 Swift 中不可用。
有没有更优雅的解决方案,这样try init()才有效?