2009-10-14 7 views
18

Chcę użyć valueForKeyPath na moim NSDictionary, ale problem polega na tym, że jeden z kluczy jest ciągiem rozpoczynającym się od symbolu @. Nie mam kontroli nad nazewnictwem klucza.Użycie valueForKeyPath na NSDictionary jeśli klucz rozpoczyna symbol @?

Mam problemy próbuje utworzyć ścieżkę klucza jak dostaję wyjątek formacie, nawet gdy próbuje uciec symbol @:

to działa prawidłowo:

[[[dict objectForKey:@"key1"] objectForKey:@"@specialKey"] objectForKey:@"key3"] 

jednak żadna z tych prac:

[dict valueForKeyPath:@"[email protected]"] 
[dict valueForKeyPath:@"[email protected]@specialKey.key3"] 

Jakieś pomysły?

Dzięki,

Mike

+0

Więc w zasadzie swoją DICT objectForKey: @ "key1" jest NSDictionaryObject też. I ten dict objectForKey: @ "key3" –

Odpowiedz

19

nie należy używać @ znaki z kluczowych nazw jeśli chcesz użyć wartości klucza kodowania.

apple's guidelines kluczowych nazw są następujące:

Klucze należy użyć kodowania ASCII, zaczynają się z małej litery, a nie może zawierać spacji .

Musisz znaleźć sposób na ponowne sformatowanie klucza ciągłego, pod warunkiem, że otrzymujesz klucze, aby było zgodne z KVC.

+0

Ah okej! Sądziłem, że musi nastąpić jakaś ucieczka, ale myślę o tym, oczywiście, że coś zaczynającego się od @ nie może być zgodne z KVC! Twoje zdrowie! –

+1

np. to również zaoszczędzić wiele bólu głowy, gdy używasz innych klas i technologii, które używają KVC, takich jak podstawowe dane. – pxl

1

Jeśli nie masz kontroli nad nazewnictwem, to jak dodać kategorię z prawidłowo nazwanym kluczem, który po prostu zwraca/ustawia dziwny klucz?

+0

to dobry pomysł. ale biorąc pod uwagę to, co KVC ma robić, nie rozumiem, jak to jest konieczne. KVC to rodzaj praktyki, który sprawia, że ​​nazywania i ustawiacze nazywania są spójne, dzięki czemu można uzyskać dostęp do właściwości. więc jeśli nie możesz nazwać właściwości za pomocą znaku @, nie powinieneś nigdy wchodzić w sytuację, w której byłaby to część keypath. – pxl

13

Wystarczy zaktualizować ten stary pytanie trochę ...

powodem, że te:

[dict valueForKeyPath:@"[email protected]"] 
[dict valueForKeyPath:@"[email protected]@specialKey.key3"] 

... nie jest to, że wszelkie „@” symbole w kluczowej drogi są interpretowane jako collection's operators jak z:

[dict valueForKeyPath:@"[email protected]"] // returns the sum of all 'key3' values 
[dict valueForKeyPath:@"[email protected]"] // returns the average of all 'key3' values 

w zagnieżdżone kluczowe rozmowy:

[[[dict objectForKey:@"key1"] objectForKey:@"@specialKey"] objectForKey:@"key3"] 

... działa, ponieważ pojedynczy klucz nie jest przetwarzany jako ścieżka klucza.

+0

Dzięki! Zadziałało!!! –

0

widzę, że istnieją 2 sposoby

Swizzle

Można swizzle na valueForKeyPath na NSDictionary aby usunąć symbol @, należy pamiętać, aby uwzględnić @sum, @average ...

Zastąp jeśli używasz Mantle

Zastąp + (id)modelOfClass:(Class)modelClass fromJSONDictionary:(NSDictionary *)JSONDictionary na MTLJSONAdapter, przemierzać wszystkie klucze i usunąć symbol @