swift - Swift init 能否仅适用于 Objective C?

标签 swift objective-c interop

假设我有一个 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)
  }
}

有没有办法让方便的init只能在Objective-C中使用,这样API就会更小?

最佳答案

您可以将该方法公开给 Objective-C 运行时,同时将其设为私有(private)。然而,这需要您自己引入私有(private)方法的接口(interface)(最好通过扩展自动生成的接口(interface),而不是引入单独的类声明)。你的 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 代码可以很好地使用它。

关于swift - Swift init 能否仅适用于 Objective C?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76147011/

相关文章:

ios - UITableViewCell 的 UIImage 的内存在 segue 后退按钮后未释放

java - 如何在 Clojure 中加载程序资源

swift - 检查字典中的 nil 值 - Swift 3

ios - 使用循环向多个 UIImageView 添加属性

objective-c - iOS:如何在部分 curl 中停止文本动画

c++ - 如何包装 C __cdecl API 以便 FORTRAN 可以调用它(使用 __stdcall)?

c# - 如何在不锁定的情况下打开 Excel 文件?

ios - 由于 "nil"参数导致 XCTestAssertNil 崩溃

swift - 可以是 Int、Float 或 Double 的类型

ios - 每个星期二的本地通知重复间隔不起作用..我错过了什么?