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

时间:2014-10-19 16:20:06

标签: objective-c swift

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

obj-c代码是:

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

@end

Swift代码是:

let assistant = MOAssistant.assistant;

使用此代码我收到错误:

  

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

我读到mapping factory methods to Swift initializers,但我想知道为什么我可以使用:

let fm = NSFileManager.defaultManager;

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

但没有一个解释为什么Swift表现不同。使用推荐的方式(MOAssistant())是没有解决方案,因为它直接调用该类的初始化程序(我不想要的)。

1 个答案:

答案 0 :(得分:3)

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

但是,请记住将工厂方法称为方法/函数(包括括号),否则您将获得其他内容,但不会达到预期效果。如果你指定了一个类型,你实际上不能在没有它的情况下调用它。

当您不使用括号时的LLDB输出:

  

(lldb)po助手

     

(Pecunia`_TPA__TTOFCSo11MOAssistant8makeThisfMS_FT_GSQS__ at at   RemoteResourceManager.swift)

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