如何在 Swift 子类的初始化器中调用静态 属性?
How to call a static property within the initializer of a subclass in Swift?
我在 NSManagedObject
上创建了一个扩展到 return 实体名称等于对象的具体 class 名称,可能是子 class 的名称:
extension NSManagedObject {
static var entityName: String {
return String(describing: self)
}
}
我希望这个 属性 return 是子 class 的字符串 "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
,因为这将执行超级 class' 实现,该实现将 return "NSManagedObject" 而不是 "Coffee"。 Self
也不起作用,因为它不是协议。
那么如何从这个初始化器中调用实际子class上的静态属性?
您可以使用 type(of: self)
这样您就可以访问实体名称
extension NSManagedObject {
convenience init(context: NSManagedObjectContext) {
let entityName = type(of: 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)
}
}
我在 NSManagedObject
上创建了一个扩展到 return 实体名称等于对象的具体 class 名称,可能是子 class 的名称:
extension NSManagedObject {
static var entityName: String {
return String(describing: self)
}
}
我希望这个 属性 return 是子 class 的字符串 "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
,因为这将执行超级 class' 实现,该实现将 return "NSManagedObject" 而不是 "Coffee"。 Self
也不起作用,因为它不是协议。
那么如何从这个初始化器中调用实际子class上的静态属性?
您可以使用 type(of: self)
这样您就可以访问实体名称
extension NSManagedObject {
convenience init(context: NSManagedObjectContext) {
let entityName = type(of: 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)
}
}