如何将 NSManagedObject 转换为 NSDictionary

How to convert NSManagedObject to 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 属性 returns a 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 以返回字典,而不是将对象作为 NSManagedObjects 从数据库中取出当你执行请求时。

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

不够优雅,但应该可以...

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

这是一个将某种集合转换为另一种集合的问题,即使内部类型相同,这个问题也绝非易事。

编辑: 多一点 swift 精神

var names = map(order?.entity.attributesByName.keys){return [=11=] as! String}