假设我有一个 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就会更小?
您可以将该方法公开给 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 代码可以很好地使用它。
如果这是您的目标,您无法将其隐藏以防止自动完成。
你能做的是:
@available(swift, obsoleted: 1.0)
convenience init ( min: Int, max: Int )
{
现在尝试从 Swift 调用该方法是一个硬错误,默认情况下自动完成不会建议 init,但它仍然在列表中。