Як додати до словника NSD


93

Я використовував NSMutableArrayі зрозумів, що користуватися словником набагато простіше для того, чого я намагаюся досягти.

Я хочу зберегти ключ як a, NSStringа значення як a intу словнику. Як це робиться? По-друге, в чому різниця між змінним і звичайним словником?

Відповіді:


199

Змінний словник може бути змінений, тобто ви можете додавати і об'єкти видалити. Незмінні фіксується , коли він буде створений.

створити та додати:

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

і отримати:

int myNumber = [[dict objectForKey:@"A cool number"] intValue];

Вам потрібно ініціювати з ємністю, чи це може бути просто динамічно?
muttley91

2
Вам не потрібно вказувати початкову ємність, але ви можете побачити підвищення продуктивності, якщо це зробите. Якщо ви заздалегідь знаєте, скільки предметів він буде містити, вкажіть це число або трохи більше значення.
Eiko

запитувати NSDictionary, а не NSMutableDictionary?
Ananta Prasad

35

Встановивши, ви використовуєте setValue:(id)value forKey:(id)keyметод NSMutableDictionaryоб'єкта:

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

Або в сучасній Objective-C:

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

Різниця між мінливим і "нормальним" полягає, ну, у мінливості. Тобто ви можете змінити вміст NSMutableDictionaryNSMutableArray), тоді як ви не можете зробити це за допомогою "звичайного" NSDictionaryтаNSArray


2
Чи не слід обертати це ціле число числом NSNumber?
Johan Kool

У мене є ще одне питання з цим. Мені потрібно зберегти введений користувачем текст як рядок, а також посилання на зображення (індекс у масиві зображень), до якого користувач зберігає текст. Я спробував mutableArray об'єктів, які мають 2 змінні, по одній для кожної, яку я щойно згадав. це не працювало добре при спробі заповнити tableView текстовими значеннями об’єктів масиву. ТАК Я подумав про словник, єдина проблема полягає в тому, що це не виглядає так, ніби я можу отримати дані за індексом, це повинен бути ключ або значення, як хеш-карта, так?
система

@Johan - правильно та оновлено! @alJaree - так, словник є сховищем ключових значень. Я думаю, що на вашій позиції вам було б краще мати безліч словників. Щось на кшталт[{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

Це все ще не працює для мене, тому що мені потрібно отримати текст з кожного об'єкта і використовувати його для заповнення вибраного UITableView, а також мені потрібно посилання на індекс до масиву зображень, щоб я міг отримати та відобразити вибране улюблене зображення. Я спробував об'єкт, який я описав вище, але повертав об'єкти під час читання з масиву, де NSStrings з якихось причин, а не конкретного об'єкта, який зберігався. Я не знаю, що мені тут робити,
система

Я думаю, що мені може знадобитися просто зберегти NSStrings, такі як @ "% d _% @, index, savedTitle, а потім просто розділити NSString і взяти і розплатити те, що мені потрібно. Я думаю, висловлюючись на Java, впевнений, функція розбиття в obj c. :)
система

16

Коли коли-небудь масив оголошено, тоді лише нам потрібно додати ключ-значення в NSDictionary like

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

ми не можемо додати або видалити значення ключа в цьому словнику NSD

Де, як і в NSMutableDictionary, ми можемо додавати об'єкти після інціалізації масиву також за допомогою цього методу

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

для видалення значення ключа ми повинні використовувати наступний код

[mutableDict removeObject:@"Value1" forKey:@"Key1"];

12

Оновити версію

Завдання-C

Створити:

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

Зміна:

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

Викликається короткий синтаксис Objective-C Literals.

Стрімкий

Створити:

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

Зміна:

dictionary["myKey3"] = 3

1

Ви хочете запитати: "у чому різниця між змінним масивом або словником, що не змінюється." Багато разів різні терміни використовуються для опису речей, про які ви вже знаєте. У цьому випадку ви можете замінити термін "змінний" на "динамічний". Отже, взаємозамінний словник або масив - це «динамічний» і може змінюватися під час виконання, тоді як незмінний словник або масив - це «статичний» і визначений у вашому коді, і не змінюється під час виконання (іншими словами , ви не будете додавати, видаляти або можливо сортувати елементи.)

Щодо того, як це робиться, ви просите нас повторити документацію тут. Все, що вам потрібно зробити, це здійснити пошук у зразку коду та документації Xcode, щоб побачити, як саме це робиться. Але змінна річ кинула і мене, коли я вперше вчився, тож я вам її дам!


Іноді в документах Xcode немає достатньо пристойного пояснення, воно потрапляє в глибоку теорію без чітких прикладів, не завжди, але іноді. : P Так, я зараз розумію змінні (здатні мутувати) частини, дякую. :)
система

0

Для довідки ви також можете використовувати initWithDictionaryдля ініціалізації NSMutableDictionaryбуквальний:

NSMutableDictionary buttons = [[NSMutableDictionary alloc] initWithDictionary: @{
    @"touch": @0,
    @"app": @0,
    @"back": @0,
    @"volup": @0,
    @"voldown": @0
}];
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.