【问题标题】:Core Data: Generic class function to return object核心数据:返回对象的通用类函数
【发布时间】:2021-10-15 04:32:02
【问题描述】:

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

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

我不想为每个子类编写此函数,而是将通用版本作为 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
    }
}

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

【问题讨论】:

  • 使用here描述的协议扩展
  • @vadian:虽然我认为协议扩展的概念很有趣,但它并没有解决我的示例中的问题,您仍然会遇到同样的错误。
  • 它可以与let results = try? context.fetch(fetchRequest) as? [Self] 一起使用吗?

标签: swift core-data


【解决方案1】:

context.fetch() 返回[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
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 2017-02-16
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多