Swift init 能否仅适用于 ObjectiveC?

问题描述 投票:0回答:2

假设我有一个 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就会更小?

swift objective-c interop
2个回答
2
投票

您可以将该方法公开给 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 代码可以很好地使用它。


0
投票

如果这是您的目标,您无法将其隐藏以防止自动完成。

你能做的是:

@available(swift, obsoleted: 1.0)
convenience init ( min: Int, max: Int ) 
{

现在尝试从 Swift 调用该方法是一个硬错误,默认情况下自动完成不会建议 init,但它仍然在列表中。

© www.soinside.com 2019 - 2024. All rights reserved.