我在我的Swift 4.1代码中使用了一个第三方库,该库有一个名为init()
的类级别方法的Obj-C头文件。当我尝试调用它时,编译器会混淆并表示我想要使用实例初始化程序还是这个静态初始化方法,如下所示:
My3rdPartyClass.init() // 错误:'init()'的使用不明确
在My3rdPartyClass.h
文件中:
@interface My3rdPartyClass : NSObject
+(void)init;
@end
我在我的Swift 4.1代码中使用了一个第三方库,该库有一个名为init()
的类级别方法的Obj-C头文件。当我尝试调用它时,编译器会混淆并表示我想要使用实例初始化程序还是这个静态初始化方法,如下所示:
My3rdPartyClass.init() // 错误:'init()'的使用不明确
在My3rdPartyClass.h
文件中:
@interface My3rdPartyClass : NSObject
+(void)init;
@end
+ (void)init;
和NSObject
的初始化方法
- (instancetype)init
在Swift中,可以使用My3rdPartyClass.init()
来调用这些类。可能的解决方案有:
Annotate the function declaration with a different Swift name:
+(void)init NS_SWIFT_NAME(classInit());
That leaves the Objective-C interface unchanged, but the function can be called from Swift as
OClass.classInit()
If no modification of the Objective-C header file is possible then you can still call the function from Swift as
My3rdPartyClass.init() as Void
The Void
return type resolves the ambiguity.
从Swift 4.2 (Xcode 10)开始,您可以这样调用类方法:
OClass.`init`()
没有对Objective-C API做任何更改(归功于@Hamish)。反引号告诉编译器,你想要成员函数而不是初始化程序。
My3rdPartyClass.\
init`(),以便告诉Swift“是的,我指的是标识符”(如果我没记错,Swift 4.2是第一个正确区分初始化程序和名为
init`的静态成员的版本,因此在4.1中无法使用)。但是,是的,这是一个糟糕的API。 - Hamishinit
的静态成员。无论如何,OP在那个问答中得到的行为都是一个错误。 - Hamish