首页 文章

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

提问于
浏览
2

我有一些Objective-C类,我想从Swift中使用它 . 由于超出此问题范围的原因,我的类 init 方法被标记为不可用 . 相反,有一种工厂方法 . 这简化了我的课程:

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

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

如何让Swift使用工厂方法?


Additional experiments:

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

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

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

这意味着它是允许 let x = MyClass() 编译的工厂方法,但在运行时调用"wrong"方法 .

1 回答

  • 1

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

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

    诀窍 . 感谢Hamish Knight找到了它(https://bugs.swift.org/browse/SR-9456) .

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

相关问题