6

我在 Objective-C 中定义了一个类,它的初始化程序是-initWithError:(初始化程序可能由于对外部资源的依赖而失败)。我希望它以init() throws. 从 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 标头中标记-initusing 。NS_UNAVAILABLE不幸的是,这不起作用。-initWithError:仍然被桥接为init(error: ()),并且尝试调用try Foo()会导致编译器错误,指出init()在 Swift 中不可用。

有没有更优雅的解决方案,这样try init()才有效?

4

1 回答 1

5

您可以使用 重命名函数NS_SWIFT_NAME。在这种情况下:

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

也就是说,这感觉像是一个编译器错误。我建议打开一个缺陷

于 2018-03-26T01:53:57.077 回答