代码之家  ›  专栏  ›  技术社区  ›  Andrew Madsen

如何将Objective-C初始错误:方法连接到Swift

  •  6
  • Andrew Madsen  · 技术社区  · 7 年前

    我在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() 与继承的平原相冲突 -初始化 初始值设定项。这可以从Swift调用,如下所示:

    let foo = try Foo(error: ())
    

    这看起来很奇怪,因为error参数是void。如果将其作为 init()抛出 。显而易见的解决办法是 -初始化 使用 NS_UNAVAILABLE 在Objective-C标题中。不幸的是,这不起作用。 -初始错误: 仍然被桥接为 init(error: ()) ,并尝试呼叫 try Foo() 导致编译器错误,表示 初始化() 在Swift中不可用。

    有没有更优雅的解决方案 try init() 只是工作?

    1 回复  |  直到 7 年前
        1
  •  5
  •   Rob Napier    7 年前

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

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

    也就是说,这感觉像是一个编译器bug。我建议开一家 defect