我在实现扩展功能时遇到了一些问题,无法确定实体是否包含任何结果。最终目标是确定某个实体是否有结果,如果没有,则在应用启动时将其播种(对于某些实体,如国家/地区列表等)
这是我能够获得的地方,但是swift编译器并不开心;错误:类型'T'不符合协议'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
}
}
}
答案 0 :(得分:1)
您必须将T
限制为NSManagedObject
子类。
如果您只对count(for:)
感兴趣,也应该使用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
可以(并且应该)始终简化为
public MyClass() {
// set variables initial default value if any or leave empty
}