如何将NSManagedObject转换为NSDictionary

我试图将NSManagedObject转换为NSDictionary这是我试过:

 var keys:NSArray = order?.entity.attributesByName.keys var dict:NSDictionary = order?.dictionaryWithValuesForKeys(keys) 

但是我得到错误:

  LazyForwardCollection<MapCollectionView<Dictionary<NSObject, AnyObject>, NSObject>>? is not convertible to NSArray. 

我在这里做错了什么?

字典的keys属性返回一个LazyForwardCollection ,它必须被转换成一个真实的数组。

另一个问题是, order显然是一个可选的,所以它需要解包,例如与可选的绑定。

 if let theOrder = order { let keys = Array(theOrder.entity.attributesByName.keys) let dict = theOrder.dictionaryWithValuesForKeys(keys) } else { // order is nil } 

您可以将您的NSFetchRequest上的resultType设置为DictionaryResultType以便在执行请求时返回DictionaryResultType ,而不是像NSManagedObject一样将对象从数据库中取出。

但是,您将无法编辑这些字典中的值,并将更改保存在数据库中。 如果你只是需要从你的数据库中读取,那么这不是一个问题。

不优雅,但这应该工作…

 var names = Array<String>() for attributeName in order?.entity.attributesByName.keys { names.append(attributeName as! String) } 

这是将某种集合转换成另一种集合的问题,即使内部types相同,这也是不平凡的。

编辑:更快的精神

 var names = map(order?.entity.attributesByName.keys){return $0 as! String}