swift 核心数据:在重写init(entity:,insertInto:)时无法隐藏NSManagedObject便利性init(content:)

o7jaxewo  于 2023-04-04  发布在  Swift
关注(0)|答案(1)|浏览(88)

我想我在核心数据中发现了一个奇怪的bug。我试图在我的子类中隐藏类NSManagedObject的默认初始化器。一开始这没有问题。只有你必须实现自己的初始化器:

@objc(Foo)
public class Foo: NSManagedObject {
  private var object: Int = 0
  
  public init(object: Int, context: NSManagedObjectContext) {
    let entity = NSEntityDescription.entity(forEntityName: String(describing: Self.self), in: context)!
    super.init(entity: entity, insertInto: context)
    self.object = object
  }  
}

因此,以下代码未按预期编译:

let foo = Foo(context: ...)

现在向这个类添加另一个初始化器,如下所示(因为this

@objc(Foo)
public class Foo: NSManagedObject {
  private var object: Int = 0
  
  public init(object: Int, context: NSManagedObjectContext) {
    let entity = NSEntityDescription.entity(forEntityName: String(describing: Self.self), in: context)!
    super.init(entity: entity, insertInto: context)
    self.object = object
  }  

  override private init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?) {
    super.init(entity: entity, insertInto: context)
  }
}

这一次,将编译以下代码:

let foo = Foo(context: ...)

怎么回事?我怎么能隐藏这个初始化器?
我也在Apple's Developer Forum上发布了这个。

qyswt5oh

qyswt5oh1#

正如@Martin R所指出的,初始化器Foo(context: ...)在那里,因为我覆盖了 * 所有**指定的 * 初始化器,参见规则2。
要隐藏此初始化程序,您可以将其标记为 unavailable

@available(*, unavailable)
  public convenience init(context: NSManagedObjectContext) {
    fatalError("Initialiser is hidden!")
  }

相关问题