【问题标题】:ObjC <-> Swift bridging and factory methodsObjC <-> Swift 桥接和工厂方法
【发布时间】:2018-12-10 11:15:16
【问题描述】:

我有一些我想在 Swift 中使用的 Objective-C 类。 由于超出此问题范围的原因,我的类 init 方法被标记为不可用。相反,有一个工厂方法。这是对我的班级的简化:

@interface MyClass : NSObject
+ (instancetype)myClass;
- (instancetype)init NS_UNAVAILABLE;
@end

当我在 Swift 中使用它时,我可以使用 let x = MyClass() 这很好,因为根据桥接规则,编译器会尝试将工厂方法映射到普通的初始化程序。问题是调用了“不可用”init 方法而不是工厂方法。

如何让 Swift 使用工厂方法?


其他实验:

我确定 NS_UNAVAILABLE 有效,因为如果我这样做:

@interface MyClass : NSObject
- (instancetype)init NS_UNAVAILABLE;
@end

然后在 Swift 方面,我收到了预期的 'init()' is unavailable 错误消息。

这意味着它是允许let x = MyClass() 编译的工厂方法,但在运行时调用了“错误”的方法。

【问题讨论】:

  • 看起来像这些工具中的错误。如果我是,我只需将工厂方法重命名为其他任何名称并在 Swift 中使用它,例如 MyClass.instance()
  • 是的,我可以这样做,但如果可能的话,我更愿意允许来自 Swift 的标准 _ = MyClass()。另一种解决方案是从 init 调用工厂方法,但这意味着(除了代码味道之外)完成了 2 次分配。
  • 这似乎是一个编译器错误,我会报告它,我只是想知道是否有人遇到它并设法解决它:)

标签: ios objective-c swift


【解决方案1】:

好像头文件中的两个方法互换了,即

@interface MyClass : NSObject
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)myClass;
@end

成功了。感谢发现它的 Hamish Knight (https://bugs.swift.org/browse/SR-9456)。

我将采用这种方法,直到在编译器端正确修复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多