ObjC <-> Swift桥接和工厂方法

时间:2018-12-10 11:15:16

标签: ios objective-c swift

我想从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()进行编译,但是在运行时将调用“错误”方法。

1 个答案:

答案 0 :(得分:1)

似乎交换了头文件中的两个方法,即

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

可以解决问题。感谢Hamish Knight找到了(https://bugs.swift.org/browse/SR-9456)。

我将继续使用这种方法,直到在编译器端将其正确修复为止。