【发布时间】:2018-07-08 12:45:36
【问题描述】:
我在NSManagedObject 上创建了一个扩展来返回一个实体名称,该名称等于对象的具体类名,可能是子类的名称:
extension NSManagedObject {
static var entityName: String {
return String(describing: self)
}
}
我希望这个属性为一个子类返回字符串“Coffee”,定义如下:
class Coffee: NSManagedObject { ... }
现在我还想在 NSManagedObject 上定义一个自定义初始化程序,它使用上面定义的属性 entityName。
extension NSManagedObject {
convenience init(context: NSManagedObjectContext) {
let entityName = Self.entityName // ???? How to obtain the entity here?
guard let entity = NSEntityDescription.entity(forEntityName: entityName, in: context) else {
fatalError("Could not find entity with name \(entityName)")
}
self.init(entity: entity, insertInto: context)
}
}
问题是我不知道如何访问这里的静态entityName。显然,我不能将其称为NSManagedObject.entityName,因为这将执行超类的实现,该实现将返回“NSManagedObject”而不是“Coffee”。 Self 也不起作用,因为它不是协议。
那么如何在这个初始化器中调用实际子类的静态属性呢?
【问题讨论】:
标签: swift initialization subclass static-methods static-members