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

Объект NSArrayAtIndex: стенография

Возможный дубликат:
Есть ли буквальный синтаксис словаря или массива в Objective-C?

Недавно я заметил, что в objective-c работает что-то странное.

Когда у меня есть массив,

NSArray *myArray = @[@"1", @"b", @"3", @"d"];

Я могу нормально получить второй элемент,

NSString *element = [myArray objectAtIndex:1]; // second element 

однако я, похоже, теперь также могу получить к нему доступ через.

NSString *element = myArray[1];

Кто-нибудь знает, является ли это теперь определенным поведением и поэтому безопасным для использования, или я должен его избегать? Спасибо всем, кто может помочь!

4b9b3361

Ответ 1

Этот синтаксис был добавлен в Clang 3.3: Objective C Literals. По сути, компилятор преобразует выражения типа objCObj[idx] в выражение [objCObj objectAtIndexedSubscript:idx]. Он также работает для словарей, и вы можете принять его для своих собственных объектов.

Таким образом, вы совершенно безопасно его используете, предполагая, что вы будете использовать современную версию Objective C и соответствующим образом обновленный компилятор Objective C (т.е. Clang).

Ответ 2

это новая функция objective-c и доступна, поскольку xCode 4.5

безопасно использовать этот синтаксис, вы даже можете дать поддержку своим собственным классам.

Ответ 3

Ya, безопасно использовать этот синтаксис.

Эти синтаксисы являются частью Modern Objective-C.

Вы можете проверить эту статью для получения дополнительных возможностей: ObjectiveCLiterals

Ответ 4

Это совершенно правильный код для последней версии компилятора LLVM. До сих пор он недействителен для других компиляторов (например, GCC).

Следует ли вам избегать этого или нет - ну, это вопрос вкуса. Об этом в Интернете несколько раз, так как индексирование ведет себя немного иначе (для его реализации используется совершенно другой метод). Также обсуждаются, использовать ли выражения литералы или нет, поскольку есть случаи, когда они делают код менее удобочитаемым (например, они написаны как литералы, но на самом деле они являются автореализованными объектами). Обратите внимание, что все делается с использованием литералов, можно сделать с помощью простых макросов.