Swift init是否只能用于ObjectiveC?

axr492tv  于 2023-05-05  发布在  Swift
关注(0)|答案(1)|浏览(191)

假设我有一个Swift类

@objcMembers class C: NSObject {
  let range: ClosedRange<Int>

  init(range: ClosedRange<Int>) {
    self.range = range
    super.init()
  }

  convenience init(min: Int, max: Int) {
    self.init(range: min...max)
  }
}

有没有办法让convenience init只在Objective-C中可用,这样API就更小了?

tktrz96b

tktrz96b1#

你可以将这个方法暴露给Objective-C运行时,同时使它成为private。但是,这需要您自己引入私有方法的接口(理想情况下,通过扩展自动生成的接口,而不是引入单独的类声明)。你的Swift类应该看起来像这样:

@objc(TDWSwiftObject)
class SwiftObject: NSObject {

    let range: ClosedRange<Int>

    init(range: ClosedRange<Int>) {
        self.range = range
        super.init()
    }

    @objc private convenience init(min: Int, max: Int) {
        self.init(range: min...max)
    }

}

然后添加缺少的Objective-C部分作为类类别:

@interface TDWSwiftObject (Private)

- (instancetype)initWithMin:(int)min max:(int)max;

@end

现在你的Swift代码将不能引用构造函数(因为它有private访问修饰符),而Objective-C代码可以很好地使用它。

相关问题