ios - 如何桥接 Objective-C initWithError : method into Swift

标签 ios objective-c swift initialization objective-c-swift-bridge

我有一个在 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/

相关文章:

ios - 搜索数据模型资源时的 nil 路径

ios - 将NSData对象转换为NSArray

objective-c - 是否可以在 Obj-C 中使用 Swift 的枚举?

ios - Swift 动画重复次数

ios - 解析我的 SWIFT 字典

ios - UIPresentationController 崩溃只是指向 AppDelegate

ios - UITextView lineHeightMultiple Clips 顶部,第一行,文本

IOS 使用 NSKeyedArchiver 保存关联数组

ios - MKLocalSearch 请求超时 NSErrorFailingURLStringKey=https ://gsp-ssl. ls.apple.com

ios - 当我回到 UIViewController 时,它会偏移