首页 文章

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

提问于
浏览
5

我有一个在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: ())

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

是否有一个更优雅的解决方案,以便 try init() 正常工作?

1 回答

  • 4

    您可以使用 NS_SWIFT_NAME 重命名该功能 . 在这种情况下:

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

    也就是说,这感觉就像编译错误 . 我建议开一个defect .

相关问题