Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Swift调用Objective-C类的工厂方法?_Objective C_Swift - Fatal编程技术网

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

如何从Swift调用Objective-C类的工厂方法?,objective-c,swift,Objective C,Swift,我有一个obj-c类,它使用工厂方法将自身实例化为单例。我将该类添加到我的Swift桥头,并希望从Swift类调用此工厂方法。然而,XCode不允许我这样做 obj-c代码为: @interface MOAssistant : NSObject { ... + (MOAssistant *)assistant; @end Swift代码为: let assistant = MOAssistant.assistant; 使用此代码,我得到了错误: “助手()”不可用:请使用对象构造“MOAs

我有一个obj-c类,它使用工厂方法将自身实例化为单例。我将该类添加到我的Swift桥头,并希望从Swift类调用此工厂方法。然而,XCode不允许我这样做

obj-c代码为:

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

@end
Swift代码为:

let assistant = MOAssistant.assistant;
使用此代码,我得到了错误:

“助手()”不可用:请使用对象构造“MOAssistant()”

我读过,但我想知道为什么我可以简单地使用:

let fm = NSFileManager.defaultManager;
尽管defaultManager也是一种工厂方法。这令人困惑。我在这里看到了其他类似的帖子:


但它们都不能解释为什么斯威夫特的行为有所不同。使用推荐的方法(
MOAssistant()
)不是解决方案,因为它直接调用该类的初始值设定项(我不希望这样)。

经常使用:解释好你的问题,你自己可能会找到答案。这是一个命名的问题。通过将工厂方法重命名为其他方法,如defaultAssistant或与之无关的方法,如makeThisInstanceForMe,我可以轻松地从Swift访问它。看起来swift头创建者删除了大写字母,以查看其是否与函数名相同(不区分大小写),如果是这样,则将其转换为swift初始值设定项调用,而不是类函数

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

不使用括号时的LLDB输出:

(lldb)采购订单助理

(Pecunia“TPA”TTOFCSO11协助8在 RemoteResourceManager.swift)


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

如果不调用函数,就不能使用NSFileManager.defaultManager;应该是NSFileManager.defaultManager()。这是奇怪的事情,我可以。但它似乎产生了一些意想不到的结果(可能是代理对象或其他引用,lldb输出看起来像一个修饰过的名称)。它可能创建的是对函数的引用。如果您将factory方法从
assistant
重命名为其他名称,它将正常工作。单例的常见约定是以
shared
开头的名称,例如
sharedAssistant
.NSFileManager.defaultManager(不带括号)是闭包。这是正确的,只是不是人们所认为的。fm是一个闭包,fm()将是默认的文件管理器。像所有旧的C函数一样,没有括号,是一个“函数指示符”,可以分配给函数指针,但不能分配给函数调用