gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 23:07:46 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com