objective-c - 从 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
解决方案
出现歧义(在Swift <= 4.1中)是因为类方法
+ (void)init;
和NSObject
s 初始化方法
- (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)。反引号告诉编译器您的意思是成员函数,而不是初始化程序。
推荐阅读
- c# - 修剪没有返回没有我要删除的字符的字符串
- excel - 如何从剪贴板发送文件?
- flutter - 一个接一个地运行相同的颤振测试。1成功1失败
- c# - Mac 上不存在指定的 deps.json
- android - 使用协程时无法捕获网络错误,但可以在 RxJava 2 中捕获该错误。我错过了什么?
- javascript - 使用弹出窗口内的表单编辑 DataTables 源数据
- linux - 如何将 colab 我的云端硬盘文件夹重命名为其他名称?
- javascript - How can I programmatically trigger ripple effect on a Vuetify.js component?
- javascript - jQuery animate API 多次触发
- java - 我无法连接到本地主机(Openserver、JDBC、MySQL)