/ / Jeśli przechowujemy NSMutableDictionary w NSDictionary, możemy później użyć go ponownie jako NSMutableDictionary? - ios, cel-c, nsdictionary, nsmutabledictionary

Jeśli przechowujemy NSMutableDictionary w NSDictionary, możemy później użyć go ponownie jako NSMutableDictionary? - ios, cel-c, nsdictionary, nsmutabledictionary

Jeśli zmienimy zmienną instancji NSDictionary na NSMutableDictionary, którą utworzymy, możemy później użyć jej ponownie jako NSMutableDictionary, przesyłając ją jako NSDictionary?

Przykład:

utworzyć i zapisać NSMutableDictionary w gnieździe NSDictionary

NSMutableDictionary *muta = [[NSMutableDictionary alloc] initWithObjects:NSArray forKeys:NSArray];
Object.nsDictionary = muta;

Pobierz słownik później

NSMutableDictionary *muta2 = (NSMutableDictionary*) Object.nsDictionary;
//Do stuff like Add objects with it
[muta2 setObject:id forKey@"key"];

Czy musimy odtworzyć NSMutableDictionary zNSDictionary, który wyciągamy z obiektu lub zachowuje jego "zmienność"? Czy możesz mi powiedzieć, dlaczego obiekt z podklasą zachowa lub nie będzie zachowywał swoje specyficzne metody i właściwości podczas zastępowania ogólnej klasy super-klasy?

Odpowiedzi:

3 dla odpowiedzi № 1

Jeśli twoja własność jest zadeklarowana jako NSDictionary wtedy nie powinieneś przyjmować żadnych założeń na temat tego, czy jest on faktycznie zmienny czy nie.

Odpowiedni kod powinien być:

NSMutableDictionary *muta2 = [Object.nsDictionary mutableCopy];

Działa to niezależnie od tego, jaki typ słownika jest faktycznie przechowywany w usłudze.


0 dla odpowiedzi nr 2

W twoim pytaniu mylicie dwie różne rzeczy: odwołujesz się do przypisania do Zmienna instancji ale pokaż kod, który pokazuje przypisanie do własność. To nie to samo. Wydaje się również, że nie rozumiesz zadanie przez odniesienie się do niego jako zastępowanie obiekt.

W języku Objective-C (i wielu innych, ale nie wszystkich językach) obiekt jest określany przez a odniesienie. To są te odniesienia przydzielony do zmiennych. Na przykład w:

NSMutableDictionary *a = [NSMutableDictionary new];
NSMutableDictionary *b = a;

Prawa strona pierwszego przypisania to wyrażenie, które tworzy nowy obiekt i zwraca odniesienie do tego obiektu. To odniesienie jest następnie przechowywane w zmiennej a. Druga linia kopiuje odniesienie, nie obiekt, przechowywany w a i przechowuje do zmiennej b.

Po tych dwóch liniach utworzono jeden obiekt i dwie zmienne, a obie zmienne dotyczą dokładnie to samo obiekt. Przypisanie odniesienia do obiektu nie zmienia obiektu, do którego się odnosi. Więc jeśli teraz zmienimy kod na:

NSMutableDictionary *a = [NSMutableDictionary new];
NSDictionary *b = a;

Wciąż mamy utworzony jeden obiekt i dwie zmienne, a obie wciąż odnoszą się do dokładnie tego samego obiektu. Przypisanie w tym przypadku jest dozwolone jako NSMutableDictionary jest podklasa z NSDictionary - to obiekt typu NSMutableDictionary jest również typu NSDictionary, zapewnia to samo zachowanie, co drugie.

Z twojego pytania "Czy możesz mi powiedzieć, dlaczego obiekt z podklasą zachowa lub nie będzie zachowywał swoje specyficzne metody i właściwości podczas zastępowania generycznej superklasy?" musisz przeczytać dalej dziedzictwo i zrozumieć, jak działa podklasowanie.

Po zapisaniu odniesienia do podklasy w zmienne wpisane w klasę superklasy, a w b w powyższym kodzie, podczas gdy ty nie zmieniłeśobiekt odniesienia i tak straciłeś bezpośrednią wiedzę, że odwołanie jest w rzeczywistości obiektem podklasy - wszystko, co możesz od razu powiedzieć o referencji przechowywanej w b powyżej jest to, że odnosi się do obiektu, który jest co najmniej NSDictionary, ale może być dowolnej podklasy NSDictionary.

Jeśli jesteś absolutnie pewnylub podobnie jak pisanie programów, które się łamią, możesz powiedzieć kompilatorowi, że ci to ufa b zawiera odniesienie do NSMutableDictionary za pomocą a odlew:

NSMutableDictionary *c = (NSMutableDictionary *)b;

Zrób to, a kompilator ci ufa, ale jeśli b nie zawiera odniesienia do NSMutableDictionary następnie twoje kolejne użycie c prawdopodobnie będzie nieważny, a twój program się zepsuje.

Musisz sprawdzić, czy odwołanie odnosi się do NSMutableDictionary lub nie, i robisz to za pomocą metody isKindOfClass::

if ([b isKindOfClass:NSMutableDictionary.class])
{
// b refers to an NSMutableDictionary
NSMutableDictionary *c = (NSMutableDictionary *)b;
// do something with c
}
else
{
// b does not refer to an NSMutableDictionary
// handle this case
}

Wrócić do nieruchomości: właściwość to dwie metody (przy założeniu, że można pisać i mieć właściwości tylko do odczytu), rębacz i a seter, które stanowią połączenie abstrakcji zmienna - możesz "odczytać" i "przypisać" do nich za pomocą kropkinotacja w wyrażeniach. Jednak ponieważ wywołują metodę, zamiast dokonywać bezpośrednich odczytów lub przypisań do zmiennej, ta metoda może zostać zmieniona, jest odczytywana lub przypisywana. W szczególności właściwość typowania obiektu zadeklarowana za pomocą Kopiuj atrybut utworzy kopię pliku obiekt to jest referencja. Na przykład:

@property (copy) NSDictionary *c;

...

NSMutableDictionary *a = [NSMutableDictionary new];
NSDictionary *b = a;
self.c = a;

następnie a & b oba odnoszą się do podobnie obiekt, który jest instancją NSMutableDictionary; podczas gdy ze względu na copy atrybut,dorefers to a *distinct* object which is an instance ofNSDictionary`.

Teraz możesz zobaczyć, dlaczego używasz Zmienna instancji i własność zamiennie w Twoim pytaniu nie jest właściwe - to, co jest przypisane, może być różne w zależności od tego, czy przypisanie dotyczy zmiennej czy właściwości.

Powinieneś czytać na temat obiektów, odniesień do obiektów, dziedziczenia i właściwości.

HTH.