核心数据: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
}
}
}
我有几个 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
}
}
}