如何为所有实体编写简单的通用核心数据函数

4 generics core-data ios swift

编辑:专门使用 Swift 泛型

我想要为我的所有实体提供一个 countAll() 函数,并且我希望通过编写一个通用函数来实现这一目标。

以下处理一个名为“Event”的实体,但我想处理一个名为“T”的实体。

我不知道如何编写这样的通用函数。有人可以帮忙吗?

func countAll() -> Int {
    let request: NSFetchRequest<Event> = Event.fetchRequest()
    do {
      return try persistentContainer.viewContext.count(for: request)
    } catch {
      XCTAssert(false, "Core Data failed to fetch with error: " + error.localizedDescription)
      return 0
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我在遇到错误之前能得到的最接近的结果:

func count<T: NSFetchRequestResult>(entityName: String) -> Int {
    let request = NSFetchRequest<T>(entityName: entityName)
    do {
      return try persistentContainer.viewContext.count(for: request)
    } catch {
      XCTAssert(false, "Core Data failed to fetch with error: " + error.localizedDescription)
      return 0
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 6

您可以传递托管对象类而不是传递NSFetchRequestResult 给通用函数:

func countAll<T: NSManagedObject>(entity: T.Type) -> Int {
    let entityName = String(describing: entity)
    let request = NSFetchRequest<T>(entityName: entityName)
    do {
        return try thePersistentContainer.viewContext.count(for: request)
    } catch {
        print(error.localizedDescription)
        return 0
    }
}

let count = countAll(entity: YourEntity.self)
Run Code Online (Sandbox Code Playgroud)

另一种方法是定义扩展方法NSManagedObject (类似于如何在 NSManagedObject Swift 扩展中创建托管对象子类的实例?):

extension NSManagedObject {

    class func countAll() -> Int {
        let eName = String(describing: self)
        let request = NSFetchRequest<NSFetchRequestResult>(entityName: eName)
        do {
            return try thePersistentContainer.viewContext.count(for: request)
        } catch {
            print(error.localizedDescription)
            return 0
        }
    }
}

let count = YourEntity.countAll()
Run Code Online (Sandbox Code Playgroud)