2009-08-08 10 views
148

Gdy patrzę na dokumentację, nie widzę dużej różnicy. Zarówno "wartość" jak i "obiekt" są typu id, więc może to być dowolny obiekt. Klucz jest raz łańcuchem, w drugim przypadku identyfikatorem. Jeden wydaje się zachować obiekt, a drugi nie. Co jeszcze? W którym przypadku?Gdzie jest różnica między setObject: forKey: a setValue: forKey: in NSMutableDictionary?

+0

możliwy duplikat [Objective-C: Jaka jest różnica między objectForKey a valueForKey?] (Http://stackoverflow.com/questions/1062183/objective-c-whats-the-difference-between-objectforkey-and-valueforkey) – Mark

Odpowiedz

157

setValue:forKey: jest częścią protokołu NSKeyValueCoding, który umożliwia między innymi uzyskiwanie dostępu do właściwości obiektu z poziomu takiego jak Interface Builder. setValue:forKey: jest zaimplementowany w klasach innych niż NSDictionary.

setObject:forKey: jest powodem, by istnieć. Jego podpis jest dość podobny do setValue: forKey :, ale jest bardziej ogólny (np. Dowolny typ klucza). To trochę zbieg okoliczności, że podpisy są tak podobne.

Co wprowadza zamieszanie w to, że implementacja NSMutableDictionary z setValue:forKey: jest w większości przypadków odpowiednikiem setObject:forKey:. W innych klasach setValue:forKey: zmienia zmienne składowe. W NSMutableDictionary zmienia wpisy słownikowe, chyba że przedrostkujesz klawisz znakiem "@" - w takim przypadku modyfikuje zmienne składowe.

Więc w pigułce, użyj setObject:forKey: gdy trzeba pracować z kluczami słownika i wartości i setValue:forKey: w rzadszych przypadkach, gdy potrzebne do rozwiązania KVP.

EDIT: och, to wygląda to zostało zadane i odpowiedzi przed: Difference between objectForKey and valueForKey?

+0

to pytanie nie jest dokładnie takie samo.chodzi o metody getter, podczas gdy pytanie to dotyczy metod ustawiających. – user102008

+1

Co masz na myśli przez "W NSMutableDictionary, zmienia on wpisy w słowniku, chyba że przedrostkujesz klucz znakiem" @ "- w takim przypadku modyfikuje zmienne składowe . " Jakie zmienne członkowskie? Być może możesz wypowiedzieć się na http://stackoverflow.com/questions/5755917/? Dzięki. –

+0

tylko dla kompletności, setObject: forKey podniesie (wyjątek), jeśli obiekt jest zerowy. Czy setValue: forKey będzie zachowywał się tak samo, czy usunie istniejący obiekt ze słownika przy ustawieniu zero dla klucza? –

80

Inną różnicą jest to, że jeśli dać zerowa wartość do setValue:forKey:, usuwa klucz ze słownika, jeśli istnieje, w przeciwnym razie nic nie robi. Ale jeśli dasz zerową wartość do setObject:forKey:, to podnosi wyjątek.

+10

Jest to bardzo przydatne, aby wiedzieć. W przeciwnym razie napisałem własną kategorię na NSMutableDictionary, aby osiągnąć dokładnie to !. Dzięki – Arman

+2

Kolejna różnica polega na subskrybowaniu celu c, możesz napisać 'dic [key] = value;' aby wesprzeć usunięcie klucza, jeśli wartość wynosi 'nil'. Zasubskrybowanie jest na ogół lepszym rozwiązaniem niż "setValue: forKey:", aby to osiągnąć. –

3

anObject — Wartość klucza. Obiekt otrzymuje komunikat zatrzymujący przed dodaniem go do NSDictionary. Ta wartość nie może być zerowa.

aKey — Klucz wartości. Klucz jest kopiowany (przy użyciu copyWithZone:, klucze muszą być zgodne z protokołem NSCopying). Klucz nie może być zerowy.

wartość — Wartość klucza.

klucz — Klucz wartości. Zwróć uwagę, że podczas używania kodowania klucz-wartość klucz musi być ciągiem znaków (patrz "Podstawy kodowania wartości klucza").

+0

Dziękuję za podanie przyczyny, dla której setObject: forKey: podnosi wyjątek. @breakfreehg –

5

-setValue:forKey: wystarczy wysłać -setObject:forKey: do odbiornika, chyba że wartość jest nil, w którym to przypadku wysyłania -removeObjectForKey.

Martwe proste.

+0

Dokładnie to działa. –

+0

o masz rację, bracie. Przepraszam za to. Jest to udokumentowane tutaj: https://developer.apple.com/reference/foundation/nsmutabledictionary/1416335-setvalue?language=objc – Eddie

Powiązane problemy