Доступ к элементам NSArray с помощью индекса - PullRequest
7 голосов
/ 12 ноября 2011

Возможно ли получить доступ к объектам NSArray, используя [idx]?У меня есть стандартная библиотека, которая использует индексацию стиля [], и я не хочу переписывать всю библиотеку, чтобы она соответствовала objectAtIndex: метод ObjC.

Ответы [ 3 ]

20 голосов
/ 17 ноября 2012

Принятый ответ (хотя и истинный в то время) устарел. Начиная с Xcode 4.5, теперь вы можете устанавливать и получать элементы NSArray, используя:

id object = array[5]; // equivalent to [array objectAtIndex:5];
mutableArray[5] = object; // equivalent to [mutableArray replaceObjectAtIndex:5 withObject:object];

Вы также можете сделать то же самое для NSDictionaries, используя:

id object = dict[@"key"]; // equivalent to [dict objectForKey:@"key"];
mutableDict[@"key"] = object; // equivalent to [mutableDict setObject:object forKey:@"key"];

Еще круче, теперь вы можете создавать объекты массива и словаря, используя JSON-подобный синтаксис:

NSArray *array = @[@"value1", @"value2"]; // equivalent to [NSArray arrayWithObjects:@"value1", @"value2", nil];
NSDictionary *dict = @{@"key1":@"value1", @"key2":@"value2"}; // equivalent to [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];

Аналогичным образом, значения в штучной упаковке, такие как NSNumber, теперь можно записать в сокращенном синтаксисе:

NSNumber *intNumber = @5; // equivalent to [NSNumber numberWithInteger:5];
NSNumber *boolNumber = @YES; // equivalent to [NSNumber numberWithBool:YES];
NSNumber *someNumber = @(variable); // equivalent to [NSNumber numberWithWhatever:variable];

EDIT:

Гораздо более подробный ответ, чем мой, здесь: Каковы подробности "Objective-C Literals", упомянутые в примечаниях к выпуску Xcode 4.4?

РЕДАКТИРОВАТЬ 2:

Для ясности, хотя эта функция не была добавлена ​​до Xcode 4.5, она работает на iOS 4.3 и выше, поэтому вам не нужно избегать ее использования, если вам требуется поддержка более старых версий iOS.

РЕДАКТИРОВАТЬ 3:

Ради педантичной точности он работает на компиляторе Apple LLVM версии 4.1 и выше. AKA версия, которая поставляется с Xcode 4.5.

1 голос
/ 12 ноября 2011

Это невозможно, к сожалению (или нет).Единственный вариант, который у вас есть, - это создать оболочку C ++ вокруг NSArray и переопределить operator[].Затем все ваши файлы, которые используют эту оболочку, должны быть Objective-C ++ (т. Е. Использовать расширение .mm) для правильной компиляции.

РЕДАКТИРОВАТЬ:

Обновление к этому ответу.Начиная с Xcode 4.5 / iOS 6, для доступа к элементам NSArray возможно использование пользовательской подписки:

 NSArray* array = ...;
 id val = array[i];

Это официальные примечания к выпуску Xcode 4.5 формулировка:

Поддержка подписки с использованием синтаксиса '[]' для объектов-контейнеров Objective-C поддерживается для iOS 6.0.

(Спасибо Нику Локвуду за его комментарий ниже)

0 голосов
/ 13 ноября 2011

Неа. Однако вы можете извлечь содержимое NSArray в массив C и затем использовать оператор индекса с этим.

...