核心数据:return 对象的通用 class 函数

Core Data: Generic class function to return object

我有几个 class 基本类型 NSManagedObject 并且每个都包含一个 class 函数来 return 给定上下文的第一个对象。这是一个例子:

public class Car: NSManagedObject {
    class func first(context: NSManagedObjectContext) -> Car? {
        let fetchRequest = Car.fetchRequest()
        fetchRequest.fetchLimit = 1
        let results = try? context.fetch(fetchRequest)
        return results?.first
    }
}

我不想为每个子程序编写此函数class,而是想将通用版本作为 NSManagedObject 的扩展。我试过这个:

extension NSManagedObject {
    class func first(context: NSManagedObjectContext) -> Self? {
        let fetchRequest = Self.fetchRequest()
        fetchRequest.fetchLimit = 1
        let results = try? context.fetch(fetchRequest)
        return results?.first
    }
}

但这给出了“表达式类型不明确,没有更多上下文”错误。如何做到这一点?

context.fetch() returns [Any],但你可以有条件地将其转换为预期类型 [Self]:

extension NSManagedObject {
    class func first(context: NSManagedObjectContext) -> Self? {
        let fetchRequest = Self.fetchRequest()
        fetchRequest.fetchLimit = 1
        let results = try? context.fetch(fetchRequest) as? [Self]
        return results?.first
    }
}

或者使用真实的 do/try/catch 以便在错误情况下更好地诊断:

extension NSManagedObject {
    class func first(context: NSManagedObjectContext) -> Self? {
        let fetchRequest = Self.fetchRequest()
        fetchRequest.fetchLimit = 1
        do {
            let results = try context.fetch(fetchRequest) as? [Self]
            return results?.first
        } catch {
            print(error)
            return nil
        }
    }
}