Подтвердить что ты не робот

Добавьте значения в NSMutableDictionary в iOS с помощью Objective-C

Я начинаю разработку objective-c, и я хотел бы попросить наилучший способ реализовать список ключей и значений.

В Delphi существует класс TDictionary, и я использую его следующим образом:

myDictionary : TDictionary<string, Integer>;

bool found = myDictionary.TryGetValue(myWord, currentValue);
if (found)
{
    myDictionary.AddOrSetValue(myWord, currentValue+1);
} 
else
{
    myDictionary.Add(myWord,1);
}

Как я могу сделать это в objective-c? Существуют ли эквивалентные функции для вышеупомянутого AddOrSetValue() or TryGetValue()?

Спасибо.

4b9b3361

Ответ 1

Вы хотите реализовать свой пример в следующих строках:

EDIT:

//NSMutableDictionary myDictionary = [[NSMutableDictionary alloc] init];
NSMutableDictionary *myDictionary = [[NSMutableDictionary alloc] init];

NSNumber *value = [myDictionary objectForKey:myWord];

if (value)
{
    NSNumber *nextValue = [NSNumber numberWithInt:[value intValue] + 1];
    [myDictionary setObject:nextValue  forKey:myWord];
} 
else
{
    [myDictionary setObject:[NSNumber numberWithInt:1] forKey:myWord]
}

(Примечание: вы не можете хранить int или другие примитивы непосредственно в NSMutableDictionary, следовательно, необходимо обернуть их в объект NSNumber и убедитесь, что вы вызываете [myDictionary release], когда вы закончили с словарь).

Ответ 2

Другие ответы верны, но для этого сейчас существует более современный синтаксис. Вместо:

[myDictionary setObject:nextValue  forKey:myWord];

Вы можете просто сказать:

myDictionary[myWord] = nextValue;

Аналогично, чтобы получить значение, вы можете использовать myDictionary[key] для получения значения (или nil).

Ответ 3

Да:

- (id)objectForKey:(id)key;
- (void)setObject:(id)object forKey:(id)key;

setObject:forKey: перезаписывает любой существующий объект с тем же ключом; objectForKey: возвращает nil, если объект не существует.

Edit:

Пример:

- (void)doStuff {
  NSMutableDictionary *dict = [NSMutableDictionary dictionary];

  [dict setObject:@"Foo" forKey:@"Key_1"]; // adds @"Foo"
  [dict setObject:@"Bar" forKey:@"Key_2"]; // adds @"Bar"

  [dict setObject:@"Qux" forKey:@"Key_2"]; // overwrites @"Bar"!

  NSString *aString = [dict objectForKey:@"Key_1"]; // @"Foo"
  NSString *anotherString = [dict objectForKey:@"Key_2"]; // @"Qux"
  NSString *yas = [dict objectForKey:@"Key_3"]; // nil
}

Reedit: Для конкретного примера существует более компактный подход:

[dict
  setObject:
    [NSNumber numberWithInteger:([[dict objectForKey:@"key"] integerValue] + 1)]
  forKey:
    @"key"
 ];

Сумасшедший отступ для удобочитаемости.