假设我有一个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只在客观C上可用,这样API就会更小?

推荐答案

您可以将该方法公开给Objective-C运行时,同时将其设置为private.但是,这需要您自己引入私有方法的接口(理想情况下,通过扩展自动生成的接口,而不是引入单独的类声明).您的快速类应该如下所示:

@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)
    }

}

然后将缺少的客观C部分添加为类别:

@interface TDWSwiftObject (Private)

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

@end

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

Swift相关问答推荐

为什么Swift在某些链调用中不能对不可变值使用变异成员,而在其他链调用中则不能使用变异成员?

如何将泛型函数存储到变量中?

不使用`lockFocus`将两个重叠的NSImage转换为单个NSImage

如何在自定义视图中读取修改符子元素?

了解SWIFT中的命名VS位置函数调用

如何在SwiftUI 4+(iOS 16+)中使用新的NavigationStack进行导航

Swift中从头开始的基本HTTP客户端

ToolbarItem 包含在动画中但不应该包含在动画中

有没有办法让文本字段以不同的 colored颜色 显示而不影响半透明背景?

在 init(from decoder: Decoder) 方法中访问原始 JSON 数据

如何在一个视图控制器中创建具有相同行为的多个集合视图?

用逻辑运算符保护让

类型 '()' 不能符合 View (除非它肯定是 View,这次没有恶作剧)

SwiftUI Preview 不适用于 Core Data

在 Swift 5.5 中编写同步和异步函数

在 Swift 中获取双精度的小数部分

使 struct 可散列?

subscribeOn 和 observeOn 的顺序重要吗?

iOS/Swift:如何检测 UITextField 上的touch 动作

使用 swift IOS 使 UIBarButtonItem 消失