Jak dodać do NSDictionary

93

Użyłem NSMutableArrayi zdałem sobie sprawę, że korzystanie ze słownika jest o wiele prostsze w stosunku do tego, co próbuję osiągnąć.

Chcę zapisać klucz jako a NSStringi wartość jako a intw słowniku. Jak to się robi? Po drugie, jaka jest różnica między słownikiem mutable a zwykłym?

system
źródło

Odpowiedzi:

199

Zmienny słownika może być zmieniony, czyli można dodawać obiekty i usuń. Niezmienna jest ustalona po jej utworzeniu.

utwórz i dodaj:

NSMutableDictionary *dict = [[NSMutableDictionary alloc]initWithCapacity:10];
[dict setObject:[NSNumber numberWithInt:42] forKey:@"A cool number"];

i odzyskaj:

int myNumber = [[dict objectForKey:@"A cool number"] intValue];
Eiko
źródło
Czy musisz inicjować z pojemnością, czy może to być po prostu dynamiczne?
muttley91
2
Nie musisz określać początkowej pojemności, ale jeśli to zrobisz, możesz zauważyć wzrost wydajności. Jeśli wiesz z góry, ile elementów będzie zawierać, podaj tę liczbę lub nieco większą wartość.
Eiko
pytasz o NSDictionary zamiast NSMutableDictionary?
Ananta Prasad
35

Ustawiając, użyjesz setValue:(id)value forKey:(id)keymetody NSMutableDictionaryobiektu:

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setValue:[NSNumber numberWithInt:5] forKey:@"age"];

Lub w nowoczesnym Objective-C:

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
dict[@"age"] = @5;

Różnica między mutowalnym a „normalnym” polega na zmienności. Oznacza to, że możesz zmieniać zawartość NSMutableDictionary(i NSMutableArray), podczas gdy nie możesz tego zrobić za pomocą „normalnych” NSDictionaryiNSArray

Eimantas
źródło
2
Czy nie powinieneś zawijać tej liczby całkowitej w NSNumber?
Johan Kool
Mam z tym jeszcze jeden problem. Muszę przechowywać tekst wprowadzony przez użytkownika jako ciąg, a także odniesienie do obrazu (indeks w tablicy obrazów), do którego użytkownik zapisuje tekst. Wypróbowałem mutableArray obiektów, które mają 2 zmienne, po jednej dla każdego, o którym właśnie wspomniałem. to nie działało dobrze podczas próby wypełnienia tableView wartościami tekstowymi obiektów tablicy. Więc pomyślałem o słowniku, jedynym problemem jest to, że wygląda na to, że mogę pobrać dane według indeksu, musi to być klucz lub wartość, jak hashmap, prawda?
system
@Johan - poprawne i zaktualizowane! @alJaree - tak, słownik jest swego rodzaju magazynem klucz-wartość. Myślę, że na twoim stanowisku lepiej by było, gdybyś miał wachlarz słowników. Coś w stylu[{image: "/path/to/img/1.jpg", data: "foo bar 1"}, {image: "/path/to/img/2.jpg", data: "foo bar 2"}, ..., {image: "/path/to/img/N.jpg", data: "foo bar N"}]
Eimantas
To nadal nie zadziała dla mnie, ponieważ muszę pobrać tekst z każdego obiektu i użyć go do wypełnienia ulubionych UITableView, a także potrzebuję odwołania indeksu do tablicy obrazów, aby móc pobrać i wyświetlić wybrany ulubiony obraz. Wypróbowałem obiekt, który opisałem powyżej, ale zwrócone obiekty podczas odczytu z tablicy, w której z jakiegoś powodu NSStrings, zamiast konkretnego obiektu, który był przechowywany. Nie jestem pewien, co tu robić,
system
Myślę, że być może będę musiał po prostu przechowywać NSStrings, takie jak @ "% d _% @, index, saveTitle, a następnie po prostu podzielić NSString i wziąć i wyświetlić to, czego potrzebuję. funkcja split w obj c. :)
system
16

Kiedykolwiek tablica jest zadeklarowana, wtedy tylko musimy dodać klucz-wartość w NSDictionary jak

NSDictionary *normalDict = [[NSDictionary alloc]initWithObjectsAndKeys:@"Value1",@"Key1",@"Value2",@"Key2",@"Value3",@"Key3",nil];

nie możemy dodawać ani usuwać wartości kluczy w tym NSDictionary

Gdzie tak jak w NSMutableDictionary możemy dodać obiekty po inicjalizacji tablicy również przy użyciu tej metody

NSMutableDictionary *mutableDict = [[NSMutableDictionary alloc]init];'
[mutableDict setObject:@"Value1" forKey:@"Key1"];
[mutableDict setObject:@"Value2" forKey:@"Key2"];
[mutableDict setObject:@"Value3" forKey:@"Key3"];

aby usunąć wartość klucza, musimy użyć następującego kodu

[mutableDict removeObject:@"Value1" forKey:@"Key1"];
Madhu
źródło
12

Zaktualizuj wersję

Cel C

Stwórz:

NSDictionary *dictionary = @{@"myKey1": @7, @"myKey2": @5}; 

Zmiana:

NSMutableDictionary *mutableDictionary = [dictionary mutableCopy];     //Make the dictionary mutable to change/add
mutableDictionary[@"myKey3"] = @3;

Nazywa się składnia short hand Objective-C Literals.

Szybki

Stwórz:

var dictionary = ["myKey1": 7, "myKey2": 5]

Zmiana:

dictionary["myKey3"] = 3
Warif Akhand Rishi
źródło
1

Chcesz zapytać „jaka jest różnica między tablicą lub słownikiem mutowalną a niezmienną”. Wiele razy używa się różnych terminów do opisania rzeczy, o których już wiesz. W takim przypadku można zamienić termin „zmienny” na „dynamiczny”. Zatem słownik lub tablica z możliwością zmiany to taki, który jest „dynamiczny” i może się zmieniać w czasie wykonywania, podczas gdy słownik lub tablica niemodyfikowalna to taki, który jest „statyczny” i zdefiniowany w kodzie i nie zmienia się w czasie wykonywania (innymi słowy , nie będziesz dodawać, usuwać ani ewentualnie sortować elementów.)

Jeśli chodzi o to, jak to się robi, prosisz nas o powtórzenie dokumentacji tutaj. Wszystko, co musisz zrobić, to przeszukać przykładowy kod i dokumentację Xcode, aby zobaczyć, jak to się robi. Ale mutowalna rzecz również mnie rzuciła, kiedy się uczyłem, więc dam ci tę!

Mark Hernandez
źródło
Czasami nie ma wystarczająco przyzwoitego wyjaśnienia na temat dokumentów Xcode, wchodzi w głęboką teorię bez jasnych przykładów, nie zawsze, ale czasami. : P Tak, rozumiem teraz zmienną (zdolną do mutacji) część dzięki. :)
system
0

Dla odniesienia możesz również użyć initWithDictionarydo NSMutableDictionaryzainicjowania z dosłownym:

NSMutableDictionary buttons = [[NSMutableDictionary alloc] initWithDictionary: @{
    @"touch": @0,
    @"app": @0,
    @"back": @0,
    @"volup": @0,
    @"voldown": @0
}];
Topher Fangio
źródło