如何使用超类中声明的方法返回子类的实例?

时间:2018-08-01 13:15:37

标签: swift generics

在objc中,我创建了NSManagedObject扩展名来创建对象。现在,所有子类都可以使用它来创建自己类型的对象。我已经尝试过使用泛型,但很快就尝试了类似的事情。

extension NSManagedObject {

    // MARK: - Creation Methods

    class func create<T: NSManagedObject>(in context: NSManagedObjectContext) -> T {
        let entity = NSEntityDescription.entity(forEntityName: T.description(), in: context)!
        return T(entity: entity, insertInto: context)
    }
}

Person的子类NSManagedObject中,我可以这样称呼它:

let person = Person.create(context)

person将是NSManagedObject类型,我将不得不将其强制转换为Person,以访问名称,电话等属性。

我想以某种方式避免这种情况,并使方法create返回各种类型的instancetype,但是我不确定如何做到这一点?

1 个答案:

答案 0 :(得分:1)

我宁愿使用协议扩展而不是扩展NSManagedObject

protocol Managed
{
    associatedtype ManagedType: NSManagedObject = Self
    static var entityName : String { get }
    static func create(in context: NSManagedObjectContext) -> ManagedType
}

extension Managed where Self : NSManagedObject
{
    static var entityName : String {
        return NSStringFromClass(self).components(separatedBy: ".").last!
    }

    static func create(in context: NSManagedObjectContext) -> ManagedType
    {
        return NSEntityDescription.insertNewObject(forEntityName: entityName, into: context) as! ManagedType
    }
}

使所有NSManagedObject子类都采用协议Managed