我在实现扩展函数以确定实体是否包含任何结果时遇到了一些问题。最终目标是确定实体是否有结果,如果没有,则在应用程序启动时将其播种(对于某些实体,如国家/地区列表等...)
这是我能够得到的地方,但是 swift 编译器不满意;错误:类型“T”不符合协议(protocol)“NSFetchRequestResult”
extension NSManagedObject {
func isEmpty<T>(context: NSManagedObjectContext, entityName: String, entityType: T.Type) -> Bool {
do {
let fetch = NSFetchRequest<T>(entityName: entityName)
let count = try context.fetch(fetch)
return count == 0 ? true : false
} catch {
return true
}
}
}
最佳答案
您必须将 T
限制为 NSManagedObject
子类。
如果您只对
对象数量:
func isEmpty<T: NSManagedObject>(context: NSManagedObjectContext, entityName: String, entityType: T.Type) -> Bool {
do {
let fetch = NSFetchRequest<T>(entityName: entityName)
let count = try context.count(for: fetch)
return count == 0
} catch {
return true
}
}
但实际上你不需要那个参数:
func isEmpty(context: NSManagedObjectContext, entityName: String) -> Bool {
do {
let fetch = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)
let count = try context.count(for: fetch)
return count == 0
} catch {
return true
}
}
作为性能改进,您还可以设置
fetch.fetchLimit = 1
备注:声明
return someBooleanCondition ? true : false
可以(并且应该)总是简化为
return someBooleanCondition
关于具有通用类型的快速扩展函数 - isEmpty for FetchedResults,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49844507/