从Swift调用名为`init`的Obj-C类方法

时间:2018-09-23 20:12:19

标签: objective-c swift

我在Swift 4.1代码中使用了一个第三方库,该库包含一个Obj-C头文件,该类文件的类级别方法为init()。当我尝试调用它时,编译器会感到困惑,并说我想使用实例初始化器还是此静态init方法是模棱两可的,就像这样:

My3rdPartyClass.init() // Error: Ambiguous use of 'init()'

My3rdPartyClass.h文件中:

@interface My3rdPartyClass : NSObject

+(void)init;

@end

1 个答案:

答案 0 :(得分:5)

由于两个类方法都出现歧义(在 Swift <= 4.1 中)

+ (void)init;

NSObject的初始化方法

- (instancetype)init
在Swift中,

被称为My3rdPartyClass.init()。可能的解决方案 是:

  • 重命名Objective-C类方法。
  • 用另一个Swift名称注释函数声明:

    +(void)init NS_SWIFT_NAME(classInit());
    

    这使Objective-C接口保持不变,但是该功能可以 被Swift称为

    OClass.classInit()
    
  • 如果无法修改Objective-C头文件,则 您仍然可以从Swift中调用该函数,

    My3rdPartyClass.init() as Void
    

    返回Void的类型可以消除歧义。

Swift 4.2(Xcode 10)开始,您可以将类方法称为

OClass.`init`()

在Objective-C API中没有任何更改(归因于 @Hamish)。反引号告诉编译器您的意思是 成员函数,而不是初始化程序。