我想使用iOS10中引入的新Core Data API。
@available(iOS 10.0, *)
open class func fetchRequest() -> NSFetchRequest<NSFetchRequestResult>
我创建了通用函数来获取各种对象:
func getAllEntities<T: NSManagedObject>(ofType type: T.Type, success: @escaping ([T]) -> ()) throws -> [T] {
let fetchRequest: NSFetchRequest<T> = T.fetchRequest()
let asyncFetchRequest = NSAsynchronousFetchResult(fetchRequest: fetchRequest) { result in
success(result.finalResult ?? [])
}
try databaseStack.persistentContainer.viewContext.execute(asyncFetchRequest)
}
但在第let fetchRequest: NSFetchRequest<T> = T.fetchRequest()
行中我遇到了问题:
无法将
'NSFetchRequest<NSFetchRequestResult>'
类型的值转换为指定类型'NSFetchRequest<T>'
我做错了什么?
答案 0 :(得分:3)
T.fetchRequest()
返回NSFetchRequest<NSFetchRequestResult>
,
您必须明确地将其强制转换为特定的NSFetchRequest<T>
:
let fetchRequest = T.fetchRequest() as! NSFetchRequest<T>
let asyncFetchRequest = NSAsynchronousFetchRequest(fetchRequest: fetchRequest) { result in
success(result.finalResult ?? [])
}
答案 1 :(得分:2)
尝试其中任何一个。
<强>一:强> 我在项目中遇到了类似的事情。
我发现Core Data实体的自动生成标题存在问题。请尝试删除:
/Users/**user**/Library/Developer/Xcode/DerivedData/**AppName**/Build/Intermediates/**AppName**/Debug-iphonesimulator/**AppName**.build/DerivedSources/CoreDataGenerated
然后用。清理你的项目
command+shift+K
然后尝试建设。
<强>两个强>
尝试使用let fetchRequest = NSFetchRequest<T>(entityName: NSStringFromClass(T.self))
Swifty 第二种方式,100%工作:
let fetchRequest = NSFetchRequest<T>(entityName: String(describing: T.self))
答案 2 :(得分:0)
NSFetchRequest boilerplate
调用(例如,用于信息数组)以()
结尾;不要忘记这一点,否则您可能会遇到此类错误。
这很容易遗漏,尤其是如果您键入代码而不是复制粘贴样板代码。