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()才有效?
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.
| 归档时间: |
|
| 查看次数: |
217 次 |
| 最近记录: |