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?

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];

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


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"];

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

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ę!


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
}];
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.