首页 > 解决方案 > 从 Swift 调用名为 `init` 的 Obj-C 类方法

问题描述

我在我的 Swift 4.1 代码中使用了第 3 方库,它有一个 Obj-C 头文件和一个名为init(). 当我尝试调用它时,编译器会感到困惑,并说我是否要使用实例初始化程序或此静态 init 方法是模棱两可的,如下所示:

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

My3rdPartyClass.h文件中:

@interface My3rdPartyClass : NSObject

+(void)init;

@end

标签: objective-cswift

解决方案


出现歧义(在Swift <= 4.1中)是因为类方法

+ (void)init;

NSObjects 初始化方法

- (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)。反引号告诉编译器您的意思是成员函数,而不是初始化程序。


推荐阅读