如何在 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)
    }

}