2011-01-25 21 views
12

Próbuję zaimplementować podklasę NSMutableDictionary, która zwraca zero zamiast rzucania wyjątku NSUndefinedKeyException, gdy klucz nie występuje w słowniku.Podklasy NSMutableDictionary

Jednak gdy próbuję dodać obiekty do mojego słownika mam

[NSMutableDictionary setObject:forKey:]: method only defined for abstract class 

NilDictionary.h

@interface NilDictionary : NSMutableDictionary { 
} 
@end 

NilDctionary.m

@implementation NilDictionary 
- (id)valueForUndefinedKey:(NSString *)key { 
    return nil; 
} 
@end 

Czy naprawdę muszę wdrożyć wszystko metody z NSMutableDictionary ponownie w mojej podklasy lub istnieje inna klasa I powinny być subclas śpiewać?

Wyjaśnienie: Mój pierwotny problem sprowadzał się do tego, że nie byłem w stanie prawidłowo odczytać dokumentacji.

Jeśli potrzebujesz podklasy NSMutableDictionary sprawdź poprawną odpowiedź. Jeśli chcesz słownik, który zwraca zero, gdy klucz nie jest obecny, NSMutableDictionary robi to już.

+1

Co dokładnie robisz ze słownikiem, aby spowodować wyrzucenie 'NSUndefinedKeyException'? Próba dostępu do nieprawidłowego klucza w słowniku automatycznie zwraca 'nil'; jak otrzymujesz ten błąd? –

Odpowiedz

25

NSMutableDictionary Class Reference mówi:

W podklasie, należy zastąpić oba jego prymitywnych metod:

1. setObject: forKey:
2. removeObjectForKey:

Musisz również nadpisuje prymitywne metody klasy NSDictionary.


NSDictionary Class Reference mówi:

Jeśli trzeba podklasy NSDictionary, trzeba wziąć pod uwagę, że jest reprezentowany przez Class cluster -Są zatem kilka prymitywnych metod, na których oparte są metody koncepcyjnie:

1. Ilość
2. objectForKey:
3. keyEnumerator
4. initWithObjects: znalezienia kluczy: Ilość:

W podklasie, ty musi zastąpić wszystkie te metody.

inne metody działają poprzez wywołanie jednego lub więcej z tych elementów pierwotnych. Metody niepochodzące z prymitywów zapewniają wygodne sposoby uzyskiwania dostępu do wielu wpisów naraz.


Wydaje się, że trzeba odłączać wszystkie te sześć metod, aby Państwa praca NSMutableDictionary podklasa doskonały.

+0

Musisz także zastąpić 'initWithObjects: forKeys: count:' –

4

Oto twój problem. NSDictionary (i jego zmienny odpowiednik) jest częścią klastra klasy (więcej informacji na ten temat: here, pod nagłówkiem "Gromada klasowa") i nie należy go poddawać podklasie, ponieważ powoduje problemy, takie jak to, o czym wspomniałeś (przeczytaj podtytułowe notatki w NSDictionary Class Reference). Niezależnie od tego, co musisz zrobić, będziesz miał możliwość rozszerzenia klas, z których chcesz skorzystać, aby robić to, co chcesz. Na przykład powyższy kod można z łatwością umieścić w kategorii (więcej informacji na temat kategorii here).

+0

Dzięki za heads up. Wygląda na to, że do podklasy klastrów klasowych wystarczy zaimplementować wszystkie prymitywne metody. Dla NSMutableDictionary oznacza to, że również trzeba napisać prostą implementację dla * liczyć * objectForKey: * keyEnumerator * setObject: forKey: * removeObjectForKey: jestem niezdecydowany używać kategorię, bo jak rozumiem, że wpływa na każde użycie NSMutableDictionary w mojej aplikacji? – Ben

+0

Ponadto, nie wiem, co robisz źle, ale kiedy próbujesz uzyskać dostęp do klucza nie znaleziono w słowniku, zwraca 'nil' tak czy inaczej; nie rzuca 'NSUndefinedKeyException' ... Co dokładnie próbujesz zrobić? –

+0

Dzięki. Prawdopodobnie powinienem był po prostu wypróbować to zamiast szukać go w dokumentacji. – Ben

-1

Czy jesteś pewien, że nie otrzymujesz wyjątku podczas przekazywania "nil" dla KEY (a nie wartości)?