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

And*_*sen 5 initialization objective-c ios swift objective-c-swift-bridge

我有一个在Objective-C中定义的类,其初始化程序是-initWithError:(初始化程序可能由于依赖外部资源而失败).我希望这能成为Swift的桥梁init() throws.从NSObject继承的常规初始化程序-init可以标记为不可用,因为我不希望它被使用.

在Objective-C中,我有:

@interface Foo : NSObject

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

@end
Run Code Online (Sandbox Code Playgroud)

当然,这在Objective-C中工作正常.

在Swift中,-initWithError被桥接为init(error: ()) throws.这可能是因为withError:从方法名称中删除会导致init()与继承的普通-init初始化程序发生冲突.这可以从Swift调用,如下所示:

let foo = try Foo(error: ())
Run Code Online (Sandbox Code Playgroud)

这看起来很奇怪,因为error参数是无效的.如果将其作为进口进口肯定会更好init() throws.显而易见的解决方案是在Objective-C标头中标记-init使用NS_UNAVAILABLE.不幸的是,这不起作用.-initWithError:仍然被桥接init(error: ()),并试图try Foo()在编译器错误中调用结果,说明init()在Swift中不可用.

是否有一个更优雅的解决方案,这样try init()才有效?

Rob*_*ier 5

You can rename the function using NS_SWIFT_NAME. In this case:

- (instancetype _Nullable)initWithError:(NSError **)error NS_SWIFT_NAME(init());
Run Code Online (Sandbox Code Playgroud)

That said, this feels like a compiler bug. I'd suggest opening a defect.