我在Swift 4.1代码中使用了一个第三方库,该库包含一个Obj-C头文件,该类文件的类级别方法为init()
。当我尝试调用它时,编译器会感到困惑,并说我想使用实例初始化器还是此静态init方法是模棱两可的,就像这样:
My3rdPartyClass.init() // Error: Ambiguous use of 'init()'
在My3rdPartyClass.h
文件中:
@interface My3rdPartyClass : NSObject
+(void)init;
@end
答案 0 :(得分:5)
由于两个类方法都出现歧义(在 Swift <= 4.1 中)
+ (void)init;
和NSObject
的初始化方法
- (instancetype)init
在Swift中,被称为My3rdPartyClass.init()
。可能的解决方案
是:
用另一个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)。反引号告诉编译器您的意思是 成员函数,而不是初始化程序。