2015-04-16 20 views
7

I NSManagedObject zu NSDictionary zu konvertieren Ich versuche das ist, was ich versucht:Wie konvertiert NSManagedObject zu NSDictionary

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

Aber ich bekomme Fehler:

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

Was mache ich hier falsch?

+0

Sie benötigen genau 'NSDictionary' oder es ist in Ordnung, wenn Sie schnellen Wörterbuch bekommen? – ilya

+0

Ich weiß es nicht. Mein Ziel ist es, dieses Wörterbuch in JSON-String zu konvertieren. Wenn ich das mit dem Wörterbuch machen kann, habe ich damit kein Problem. – 1110

Antwort

14

Die keys Eigenschaft eines Wörterbuchs gibt eine LazyForwardCollection zurück, die in ein reales Array konvertiert werden muss.

Ein anderes Problem ist, dass order anscheinend ein optionales ist, so dass es benötigt, um auszupacken, z. mit optionaler Bindung.

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

Dies gibt den gleichen Fehler zurück – 1110

+0

@ 1110: Seltsam, ich arbeitete für mich. –

+0

Ich weiß es nicht. Ich benutze swift 1.2. Es erfordert von mir, den Parameternamen hinzuzufügen, aber die zweite Zeile kann nicht übergeben werden: 'let keys = Array (arrayLiteral: order? .entity.attributesByName.keys) let dict = order? .dictionaryWithValuesForKeys (Schlüssel)' – 1110

0

Statt die Objekte aus der Datenbank als NSManagedObject s zu bekommen, könnten Sie die resultType, auf NSFetchRequest, auf DictionaryResultType gesetzt Wörterbücher haben zurückgegeben, wenn Sie die Anfrage auszuführen.

Sie können jedoch keine Werte in diesen Wörterbüchern bearbeiten und die Änderungen in Ihrer Datenbank speichern. Wenn Sie nur aus Ihrer Datenbank lesen müssen, ist das kein Problem.

0

Nicht elegant, aber dies sollte arbeiten ...

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

Dies ist ein Problem, eine Art Sammlung in einer anderen umzuwandeln, die nie trivial ist, selbst wenn interne Typen gleich sind.

edit: wenig geschickter Geist

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