快速调用objective-c类方法

Posted

技术标签:

【中文标题】快速调用objective-c类方法【英文标题】:call objective-c class method in swift 【发布时间】:2015-08-18 14:34:38 【问题描述】:

我的 ios 项目同时包含 Objective-c 代码和 swift 代码。

说,我有一个名为Task的类,它包含一个类方法 do

@interface Task: NSObject
+ (void) doSomething:(NSString *) value;
@end

上面的@interface 声明在Task.h 文件中。其他objective-c 类可以毫无问题地调用该方法。

我的swift代码要调用doSomething方法,

Task.doSomething(“do task now!”)

但是上面这行代码得到如下编译错误:

‘Task.Type’ does not have a member named ‘doSomething’.

为什么?在swift代码中调用objective-c类方法的正确方法是什么?

(生成的objective-c和swift之间的桥接接口没有问题。)

【问题讨论】:

这可能只是贴出的代码中的一个类型,但是方法声明在obj-c接口中需要一个分号。 我只是忘记添加分号,我的objective-c代码中有分号。 您能否澄清您引用的@interface 声明位于哪个文件中?它需要在 .h 文件中才能看到。其他 Objective-c 类是否能够调用该方法? 我更新了我的问题,@interface 声明在 Task.h 中,其他objective-c 类可以毫无问题地调用该方法 【参考方案1】:

我认为问题在于“do”是保留关键字。我尝试了这个并得到了一个稍微不同的错误(关于在一段时间循环中丢失了一个括号),但是将方法更改为“doSomething”解决了这个问题。

通过将@interface 声明移动到Task.m 而不是Task.h,我能够重现您看到的错误。请确认您在哪里拥有此代码,因为它仅在 .h 文件中对其他类可见。

【讨论】:

如果是这个问题,可以用背包引用它来解决:Task.`do`("do task now!") 谢谢,但do 只是我的问题中的示例方法,在我的真实代码中,名称绝对不是保留关键字。我用doSomething 更新了我的问题以避免这种误导。此外,我的接口声明在它的 Task.h 中。 您可以在您的问题中添加一个桥接头的副本吗?

以上是关于快速调用objective-c类方法的主要内容,如果未能解决你的问题,请参考以下文章

在 Objective-C 中实现纯虚方法

Objective-c 类 方法声明 初始化及调用

使用另一个 C++ 类作为参数从 Objective-C(++) 调用 C++ 方法

如何快速调用 initWith...

Objective-C类方法 load 和 initialize

IOS/Objective-C:调用另一个类(VC)方法不起作用