首页 文章

如何从Swift调用Objective-C类的工厂方法?

提问于
浏览
5

我有一个obj-c类,它使用工厂方法将自身实例化为单例 . 我将该类添加到我的Swift桥接头文件中,并希望从swift类中调用此工厂方法 . 但是,XCode不会让我 .

obj-c代码是:

@interface MOAssistant : NSObject {
...
+ (MOAssistant *)assistant;

@end

Swift代码是:

let assistant = MOAssistant.assistant;

使用此代码我收到错误:

'assistant()'不可用:使用对象构造'MOAssistant()'

我读到mapping factory methods to Swift initializers但我想知道为什么我只能使用:

let fm = NSFileManager.defaultManager;

即使defaultManager也是工厂方法 . 这令人困惑 . 我在这里阅读其他帖子,如下所示:

但他们都没有解释为什么斯威夫特行为不同 . 使用推荐的方式( MOAssistant() )是没有解决方案,因为它直接调用该类的初始化程序(我不想要的) .

1 回答

  • 3

    经常这样:很好地解释你的问题,你可以自己找到答案 . 这是一个命名问题 . 通过将工厂方法重命名为 defaultAssistant 之类的东西,或者像 makeThisInstanceForMe 那样无关的东西,我可以轻松地从Swift访问它 . 看起来swift标头创建者删除大写字母以查看它是否与函数名称相同(不区分大小写),如果是这种情况则使其成为Swift初始化程序调用而不是类函数 .

    但是,请记住将工厂方法作为方法/函数(包括括号)调用,否则您将得到其他内容,但不是您所期望的 . 如果指定了类型,则实际上不能在没有的情况下调用它 .

    不使用括号时的LLDB输出:

    (lldb)po助手(RemoteResourceManager.swift中的Pecunia`TPA__TTOFCSo11MOAssistant8makeThisfMS_FT_GSQS_)

    这个问题实际上揭示了如果你使用自动/弱键入你会得到另一个危险的问题 . 弱类型语言被认为是危险的,这是有原因的,即使它们很方便 .

相关问题