Как добавить в NSDictionary


93

Я использовал NSMutableArrayи понял, что использование словаря намного проще для того, чего я пытаюсь достичь.

Я хочу сохранить ключ как NSStringи значение как 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 03

2
Вам не нужно указывать начальную емкость, но вы можете увидеть прирост производительности в этом случае. Если вы заранее знаете, сколько элементов в нем будет, укажите это число или немного большее значение.
Eiko

просить NSDictionary, а не NSMutableDictionary?
Ананта Прасад

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 объектов с двумя переменными, по одной для каждой, о которой я только что упомянул. это не сработало при попытке заполнить tableView текстовыми значениями объектов массива. Итак, я подумал о словаре, единственная проблема в том, что он выглядит так, как будто я могу получать данные по индексу, это должен быть ключ или значение, как хэш-карта, верно?
system

@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, например

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

мы не можем добавлять или удалять ключевые значения в этом NSDictionary

Где, как в 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.

Swift

Создайте:

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.