如何 运行 Swift 核心数据实体上的通用方法,更聪明的方法

How to run a generic method on a core data entity on Swift, the smarter way

我有很多核心数据实体,它们都有这个方法:

class func count(_ context:NSManagedObjectContext) -> Int

假设实体被称为:汽车、公共汽车、飞机等

我想做的就是这个,就像我平时做的那样。

let carCount = Car.count(coreDataContext)

 let busCount = Bus.count(coreDataContext)

但是,如前所述,我只有实体名称

我如何 运行 仅通过该实体的名称从该实体中获取该方法?

创建具有关联类型的协议

protocol Fetchable
{
    associatedtype FetchableType: NSManagedObject = Self
    static var entityName : String { get }
    static func count(_ context: NSManagedObjectContext) throws -> Int
}

和协议扩展

extension Fetchable where Self : NSManagedObject
{
    
    static var entityName : String { return String(describing:self) }

    static func count(_ context: NSManagedObjectContext) throws -> Int
    {
        let request = NSFetchRequest<FetchableType>(entityName: entityName)        
        return try context.count(for: request)
    }
}

NSManagedObject 个子类中采用 Fetchable