2015-04-16 35 views
7

Sto cercando di convertire NSManagedObject a NSDictionary questo è quello che ho provato:Come convertire NSManagedObject a NSDictionary

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

ma ottengo l'errore:

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

Che cosa sto facendo male qui?

+0

Avete bisogno esattamente 'NSDictionary' o è ok se si ottiene una rapida Dictionary? – ilya

+0

Non lo so. Il mio obiettivo è convertire quel dizionario in stringa JSON. Quindi, se posso farlo con il dizionario, non ho problemi con questo. – 1110

risposta

14

La proprietà keys di un dizionario restituisce un LazyForwardCollection che deve essere convertito in un array reale.

Un altro problema è che order è apparentemente un optional, quindi è necessario che lo venga scartato, ad es. con associazione facoltativa.

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

Questo restituisce lo stesso errore – 1110

+0

@ 1110: Strano, ho lavorato per me. –

+0

Non lo so. Sto usando Swift 1.2. Richiede da me di aggiungere il nome del parametro, ma la seconda riga non può passare: 'let keys = Array (arrayLiteral: order? .entity.attributesByName.keys) let dict = order? .dictionaryWithValuesForKeys (keys)' – 1110

0

Invece di ottenere gli oggetti di database come NSManagedObject s, è possibile impostare il resultType, sul NSFetchRequest, per DictionaryResultType avere Dizionari restituiti quando si esegue la richiesta.

Tuttavia, non sarà possibile modificare i valori in questi dizionari e salvare le modifiche nel database. Se hai solo bisogno di leggere dal tuo database, non è un problema.

0

Non elegante, ma questo dovrebbe funzionare ...

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

Questo è un problema di conversione di un qualche tipo di raccolta ad un altro, che non è mai banale, anche se i tipi interni sono gli stessi.

edit: po 'di spirito più veloce

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