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)
    您可以传递托管对象类而不是传递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)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           3574 次  |  
        
|   最近记录:  |