我想我在核心数据中发现了一个奇怪的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上发布了这个。
1条答案
按热度按时间qyswt5oh1#
正如@Martin R所指出的,初始化器
Foo(context: ...)
在那里,因为我覆盖了 * 所有**指定的 * 初始化器,参见规则2。要隐藏此初始化程序,您可以将其标记为 unavailable: