代码之家  ›  专栏  ›  技术社区  ›  Bartłomiej Semańczyk

如何使用泛型返回特定类型NSManagedObject的所有对象?

  •  3
  • Bartłomiej Semańczyk  · 技术社区  · 6 年前

    这就是我需要达到的目标:

    extension NSManagedObject {
        class func all<T: Self>(in context: NSManagedObjectContext) -> [T] { //error: Expected a class type or protocol-constrained type restricting '
            return mr_findAll(in: context) as! [T]
        }
    }
    

    我想这样使用它:

    let persons = Person.all(in: context)
    let hotels = Hotel.all(in: context)
    

    有可能吗?

    Person Hotel NSManagedObject .

    1 回复  |  直到 6 年前
        1
  •  3
  •   vadian    6 年前

    NSManagedObject

    protocol Managed
    {
        associatedtype ManagedType: NSManagedObject = Self
        static var entityName : String { get }
        static func all(in context: NSManagedObjectContext) throws -> [ManagedType]
    }
    
    extension Managed where Self : NSManagedObject {
        static var entityName : String { return String(describing:self) }
    
        static func all(in context: NSManagedObjectContext) throws -> [ManagedType] {
            let request = NSFetchRequest<ManagedType>(entityName: entityName)
            return try context.fetch(request)
        }
    }
    

    只需将一致性添加到 Managed 为了你所有的朋友 被管理对象 子类,然后您可以使用

    let persons = Person.all(in: context)
    let hotels = Hotel.all(in: context)