Swift 3 – NSFetchRequest不同的结果

任何帮助赞赏。

Xcode自动更新到8 …我正在针对IOS 9.3

所有代码都已转换,但现在有一件事情已经破裂,我在类似的问题中尝试了各种建议! 我以前工作的获取请求现在正在破坏。

我的目标是获得一份清晰的清单。 该应用程序崩溃了:

let results = try context.fetch(fetchRequest) 

控制台中描述的错误为:

 Could not cast value of type 'NSKnownKeysDictionary1' (0x10fd29328) to 'MyApp.BodyType' (0x10eebc820). 

这是function

 func getBodyTypes() { let context = ad.managedObjectContext let fetchRequest = NSFetchRequest(entityName: "BodyType") fetchRequest.propertiesToFetch = ["name"] fetchRequest.returnsDistinctResults = true fetchRequest.resultType = NSFetchRequestResultType.dictionaryResultType do { let results = try context.fetch(fetchRequest) for r in results { bodyTypes.append(r.value(forKey: "name") as! String) } } catch let err as NSError { print(err.debugDescription) } } 

如果下面的行是隐藏的,它不会破坏,但后来我没有得到我想要的!

 fetchRequest.resultType = NSFetchRequestResultType.dictionaryResultType 

我知道我可以使用所有结果(4300)并将它们作为一个绑定修复程序循环,但这并不是解决这个问题的正确方法,特别是因为它之前正在工作!

诀窍是使通用更通用 – 而不是在获取请求中的 ,使用

 let fetchRequest = NSFetchRequest(entityName: "BodyType") 

此获取请求的结果是[Any] ,因此您需要在使用之前强制转换为适当的字典类型。 例如:

 func getBodyTypes() { let context = ad.managedObjectContext // 1) use the more general type, NSFetchRequestResult, here: let fetchRequest = NSFetchRequest(entityName: "BodyType") fetchRequest.propertiesToFetch = ["name"] fetchRequest.returnsDistinctResults = true fetchRequest.resultType = NSFetchRequestResultType.dictionaryResultType do { let results = try context.fetch(fetchRequest) // 2) cast the results to the expected dictionary type: let resultsDict = results as! [[String: String]] for r in resultsDict { bodyTypes.append(r["name"]) } } catch let err as NSError { print(err.debugDescription) } } 

注意: NSFetchRequestResult是一种协议,由四种类型采用:
NSDictionary
NSManagedObject
NSManagedObjectID ,和
NSNumber

通常,我们将它与NSManagedObject一起使用,例如BodyType 。 但是,在这种情况下,由于语句,您将获得字典类型:

 fetchRequest.resultType = NSFetchRequestResultType.dictionaryResultType 
  let fetchRequest = NSFetchRequest(entityName: "BodyType") fetchRequest.propertiesToFetch = ["name"] fetchRequest.returnsDistinctResults = true fetchRequest.resultType = NSFetchRequestResultType.dictionaryResultType do { let results = try context.fetch(fetchRequest) for r in results { let p = (r as AnyObject).value(forKey: "name") as! String print(p) } } catch let err as NSError { print(err.debugDescription) }