【发布时间】:2014-10-19 16:20:05
【问题描述】:
我有一个 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 也是一个工厂方法。这令人困惑。我在这里阅读了其他类似这样的帖子:
- How are Objective-C factory methods converted into Swift convenience initializers?
- Create Swift instance from Objective-C factory method
但他们都没有解释为什么 Swift 行为不同。使用推荐的方式 (MOAssistant()) 不是解决方案,因为它直接调用该类的初始化程序(我不想要)。
【问题讨论】:
-
你不应该使用 NSFileManager.defaultManager 而不让它成为一个函数调用;它应该是 NSFileManager.defaultManager()。
-
这很奇怪,我可以。但它看起来会产生一些意想不到的东西(可能是代理对象或其他一些引用,lldb 输出看起来像一个修饰名称)。
-
它可能创建的是对函数的引用。
-
如果您将工厂方法从
assistant重命名为其他名称,它将正常工作。单例的常见约定是以shared开头的名称,例如sharedAssistant。 -
NSFileManager.defaultManager 没有括号是一个闭包。它是有效的,只是不是人们认为的那样。 fm 是一个闭包, fm() 将是默认的文件管理器。就像每个没有括号的旧 C 函数一样,它是一个“函数指示符”,可以分配给函数指针,但不能分配给函数调用。
标签: objective-c swift