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

Ios 如何为所有实体编写简单的通用核心数据函数,ios,swift,generics,core-data,Ios,Swift,Generics,Core Data,编辑:专门使用Swift泛型 我希望为我的所有实体都使用countAll函数,我希望通过编写一个泛型函数来实现这一点 下面处理一个名为“Event”的实体,但我想处理一个名为“T”的实体 我不知道如何编写这样的泛型函数。有人能帮忙吗 func countAll() -> Int { let request: NSFetchRequest<Event> = Event.fetchRequest() do { return try persistentC

编辑:专门使用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
    }
}
这是我在遇到错误之前能得到的最接近的值:

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
    }
}

通用函数的合适替代方法是协议扩展和类方法

protocol Fetchable
{
    associatedtype FetchableType: NSManagedObject = Self

    static var entityName : String { get }
    static func countAll(in persistentContainer: NSPersistentContainer) throws -> Int

}

extension Fetchable where Self : NSManagedObject, FetchableType == Self
{
    static var entityName : String {
        return NSStringFromClass(self).components(separatedBy: ".").last!
    }

    static func countAll(in persistentContainer: NSPersistentContainer) throws -> Int
    {
        let request = NSFetchRequest<FetchableType>(entityName: entityName)
        return try persistentContainer.viewContext.count(for: request)
    }
}

通用函数的合适替代方法是协议扩展和类方法

protocol Fetchable
{
    associatedtype FetchableType: NSManagedObject = Self

    static var entityName : String { get }
    static func countAll(in persistentContainer: NSPersistentContainer) throws -> Int

}

extension Fetchable where Self : NSManagedObject, FetchableType == Self
{
    static var entityName : String {
        return NSStringFromClass(self).components(separatedBy: ".").last!
    }

    static func countAll(in persistentContainer: NSPersistentContainer) throws -> Int
    {
        let request = NSFetchRequest<FetchableType>(entityName: entityName)
        return try persistentContainer.viewContext.count(for: request)
    }
}

您可以传递托管对象类而不是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)

您可以传递托管对象类而不是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)

你好,任。如果你仔细看的话,我实际上是在上面的代码中这样做的。而且,它根本没有回答我的问题。请浏览下面的链接:它肯定会帮助你。@Ren,那个链接是到objective-c代码的!!!我的问题是关于Swift泛型!请通读,swift代码也在chainHi@Ren中解释。如果你仔细看的话,我实际上是在上面的代码中这样做的。而且,它根本没有回答我的问题。请浏览下面的链接:它肯定会帮助你。@Ren,那个链接是到objective-c代码的!!!我的问题是关于Swift泛型!请过目,swift代码也在链中解释,这很好。我不能接受,因为它不能完全回答这个问题。尽管如此,它还是非常棒。这太棒了。我不能接受,因为它不能完全回答这个问题。不过,这真是太棒了。谢谢。类型和描述:自我回避我。我认为采用Swift,超越目标C只需要几个星期。这已经花了几年时间了!非常感谢。类型和描述:自我回避我。我认为采用Swift,超越目标C只需要几个星期。这已经花了几年时间了!