gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 08:03:29 25 4
gpt4 key购买 nike

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

obj-c代码是:

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

@end

Swift 代码是:

let assistant = MOAssistant.assistant;

使用这段代码我得到了错误:

'assistant()' is unavailable: use object construction 'MOAssistant()'

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

let fm = NSFileManager.defaultManager;

尽管 defaultManager 也是一个工厂方法。这令人困惑。我在这里阅读了其他关于 SO 的帖子:

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

最佳答案

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

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

不使用括号时的 LLDB 输出:

(lldb) po assistant

(Pecunia`_TPA__TTOFCSo11MOAssistant8makeThisfMS_FT_GSQS__ at RemoteResourceManager.swift)

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

关于objective-c - 如何从 Swift 调用 Objective-C 类的工厂方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26452604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com