2015-04-16 16 views
7

Próbuję przekonwertować NSManagedObject do NSDictionary to co starałem:Jak przekonwertować NSManagedObject do NSDictionary

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

Ale otrzymuję błąd:

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

Co robię źle tutaj?

+0

Czy trzeba dokładnie 'NSDictionary' czy to jest ok, jeśli masz szybki słownik? – ilya

+0

Nie wiem. Moim celem jest zamiana tego słownika na ciąg JSON. Więc jeśli mogę to zrobić ze słownikiem, nie mam z tym problemu. – 1110

Odpowiedz

14

Właściwość ze słownika keys zwraca wartość LazyForwardCollection, która musi zostać przekonwertowana na rzeczywistą tablicę.

Kolejny problem polega na tym, że order jest opcjonalnie opcjonalny, więc musi zostać rozpakowany, np. , np. z opcjonalnym wiązaniem.

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

Powoduje to ten sam błąd – 1110

+0

@ 1110: Dziwne, pracowałem dla mnie. –

+0

Nie wiem. Używam Swift 1.2. Wymagam ode mnie dodania nazwy parametru, ale druga linia nie może przejść: 'let keys = Array (arrayLiteral: order? .entity.attributesByName.keys) let dict = order? .sersecjaWithValuesForKeys (keys)' – 1110

0

Zamiast się obiektów z bazy danych jako NSManagedObject s, można ustawić resultType, na twojej NSFetchRequest, aby DictionaryResultType mieć Słowniki zwracane po wykonaniu żądania.

Nie można jednak edytować wartości w tych słownikach i zapisać zmian w bazie danych. Jeśli chcesz tylko odczytać z bazy danych, to nie jest problem.

0

Nie elegancki, ale to powinno działać ...

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

To jest problem przekształcania jakiegoś zbioru do drugiego, który nigdy nie jest trywialne nawet jeśli typy wewnętrzne są takie same.

edit: trochę bardziej swift duch

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