在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
,但是我不确定如何做到这一点?
答案 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