Каковы детали «Objective-C Literals», упомянутые в примечаниях к выпуску Xcode 4.4?

Я читал заметки о выпуске для Xcode 4.4 и заметил это:

Компилятор LLVM 4.0

Xcode теперь включает в себя компилятор Apple LLVM версии 4.0, включая следующие функции newObjective-C: […]
– Objective-C литералы: создавать литералы для NSArray, NSDictionary и NSNumber, точно так же, как литералы для NSString

Я заинтригован этой особенностью. Мне не совсем ясно, как работают литералы для NSString и как их можно использовать в NSArray , NSDictionary и NSNumber .

Каковы детали?

3 Solutions collect form web for “Каковы детали «Objective-C Literals», упомянутые в примечаниях к выпуску Xcode 4.4?”

Скопировано дословно из http://cocoaheads.tumblr.com/post/17757846453/objective-c-literals-for-nsdictionary-nsarray-and :

Литералы Objective-C: теперь можно создавать литералы для NSArray, NSDictionary и NSNumber (точно так же, как можно создавать литералы для NSString)

Литература NSArray

Ранее:

 array = [NSArray arrayWithObjects:a, b, c, nil]; 

Теперь:

 array = @[ a, b, c ]; 

Литералы NSDictionary

Ранее:

 dict = [NSDictionary dictionaryWithObjects:@[o1, o2, o3] forKeys:@[k1, k2, k3]]; 

Теперь:

 dict = @{ k1 : o1, k2 : o2, k3 : o3 }; 

NSNumber Литералы

Ранее:

 NSNumber *number; number = [NSNumber numberWithChar:'X']; number = [NSNumber numberWithInt:12345]; number = [NSNumber numberWithUnsignedLong:12345ul]; number = [NSNumber numberWithLongLong:12345ll]; number = [NSNumber numberWithFloat:123.45f]; number = [NSNumber numberWithDouble:123.45]; number = [NSNumber numberWithBool:YES]; 

Теперь:

 NSNumber *number; number = @'X'; number = @12345; number = @12345ul; number = @12345ll; number = @123.45f; number = @123.45; number = @YES; 

[Редактировать]

zxoq на http://news.ycombinator.com/item?id=3672744 добавила более интересные новые подписи . (Добавлено с литералами):

 arr[1] === [arr objectAtIndex:1] dict[@"key"] === [dict objectForKey:@"key"] 

[Редактировать 2]

Новые литералы ObjC обсуждались на нескольких сессиях WWDC 2012 . Я намеренно не удалял имена файлов и время каждого слайда, чтобы вы могли найти их сами, если хотите. Это, по сути, то же самое, что указано в этом посте, но есть также несколько новых вещей, которые я упомянул выше изображений.

Обратите внимание, что изображения все большие. Просто перетащите их на другую вкладку, чтобы просмотреть их в исходном размере

Литералы и бокс

 [NSNumber numberWithint:42] [NSNumber numberWithDouble:10.8] [NSNumber numberWithBool:YES] [NSNumber numberWithint:6 + x * 2012] 

Литералы и бокс

 @42 @10.8 @YES @(6 + x * 2012) 

Сбор подписей

 [NSArray arrayWithObjects: a, b, c, nil] [array objectAtIndex:i] [NSDictionary dictionaryWithObjectsAndKeys: v1, k1, v2, k2, nil]; [dictionary valueForKey:k] 

Сбор подписей

 @[a, b, c] array[i] @{k1:v1, k2:v2} dictionary[k] 

@ # numbers, @ {} словари, @


Эта часть новая. Литералы выражения

Если у вас есть выражение (например, M_PI / 16 ), вы должны поместить его в скобки.

Этот синтаксис работает для числовых выражений, booleans, нахождения индекса в (C-) строке, логических значениях, константах enums и даже символьных строках!

Литералы выражения

 NSNumber *piOverSixteen = [NSNumber numberWithDouble: (M_PI / 16)]; NSNumber *hexDigit = [NSNumber numberWithChar:"0123456789ABCDEF"[i % 16]]; NSNumber *usesScreenFonts = [NSNumber numberWithBool:[NSLayoutManager usesScreenFonts]]; NSNumber *writingDirection = [NSNumber numberWithInt:NSWritingDirectionLeftToRight]; NSNumber *path = [NSString stringWithUTF8String: getenv("PATH")]; 

Литералы выражения

 NSNumber *piOverSixteen = @( M_PI / 16 ); NSNumber *hexDigit = @( "0123456789ABCDEF"[i % 16] ); NSNumber *usesScreenFonts = @( [NSLayoutManager usesScreenFonts] ); NSNumber *writingDirection = @( NSWritingDirectionLeftToRight ); NSNumber *path = @( getenv("PATH") ); 

Подробнее о символьных строках и о том, как / когда вы можете использовать этот буквенный синтаксис:

Выделенные строки в виде строки

 NSString *path = [NSString stringWithUTF8String: getenv("PATH")]; for (NSString *dir in [path componentsSeparatedByString: @":"]) { // search for a file in dir... } 

Выделенные строки в виде строки

 NSString *path = @( getenv("PATH") ); for (NSString *dir in [path componentsSeparatedByString: @":"]) { // search for a file in dir... } 

Как работают лiteratorы массива

Как работают литераторы массива

 // when you write this: array = @[a, b, c ]; // compiler generates: id objects[] = { a, b, c }; NSUInteger count = sizeof(objects) / sizeof(id); array = [NSArray arrayWithObjects:objects count:count]; 

Как работают словарные литералы

Как работают словарные литералы

 // when you write this: dict = @{k1 : o1, k2 : o2, k3 : o3 }; // compiler generates: id objects[] = { o1, o2, o3 }; id keys[] = { k1, k2, k3 }; NSUInteger count = sizeof(objects) / sizeof(id); dict = [NSDictionary dictionaryWithObjects:objects forKeys:keys count:count]; 

Подробнее о подписи на массиве

Подписчики массива

 @implementation SongList { NSMutableArray *_songs; } - (Song *)replaceSong:(Song *)newSong atindex:(NSUinteger)idx { Song *oldSong = [_songs objectAtIndex:idx]; [_songs replaceObjectAtindex:idx withObject:newSong]; return oldSong; } 

Подписчики массива

 @implementation SongList { NSMutableArray *_songs; } - (Song *)replaceSong:(Song *)newSong atindex:(NSUinteger)idx { Song *oldSong = _songs[idx]; _songs[idx] = newSong; return oldSong; } 

Подробнее о словарных подписях

Подписки для подписчиков

 @implementation Database { NSMutableDictionary *_storage; } - (id)replaceObject:(id)newObject forKey:(id )key { id oldObject = [_storage objectForKey:key]; [_storage setObject:object forKey:key]; return oldObject; } 

Подписки для подписчиков

 @implementation Database { NSMutableDictionary *_storage; } - (id)replaceObject:(id)newObject forKey:(id )key { id oldObject = _storage[key]; _storage[key] = newObject; return oldObject; } 

[Редактировать 3]

Майк Эш имеет отличную запись об этих новых литералах. Если вы хотите узнать больше об этом материале, обязательно проверьте его .


Компилятор Objective-C имеет твердое знание макета памяти экземпляров classа NSConstantString , также как __CFConstantString class __CFConstantString . Проверьте функцию RewriteObjCStringLiteral в lib/Rewrite/RewriteModernObjC.cpp в исходном коде clang. Компилятор просто испускает данные, соответствующие макету экземпляров classа NSConstantString .

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

Из «Objective-C Literals»

1) NSNumber , NSDictionary и литералы NSArray доступны в Xcode 4.4 .

2) NSDictionary и NSArray требует « Xcode 4.4 и OS X 10.8 или более поздней NSArray SDK » или « Xcode 4.5 и iOS 6 или более поздней версии SDK »

Похоже на то, что subscript требует поддержки времени выполнения и, следовательно, не будет работать до iOS6 .

Interesting Posts

Как я могу представить файл для загрузки с controllerа MVC?

HDD просматривается в BIOS и рассматривается как устройство хранения, но никогда не может загружать окна

Cp: ​​не может stat: нет такого файла или каталога

Потерял мой пароль администратора Windows 7, нужно изменить или сбросить его

Основной пример использования .ajax () с JSONP?

Что делает «async: false» в jQuery.ajax ()?

Поврежденная графика, сбои и шумный вентилятор GPU после обновления драйверов NVIDIA GeForce до 364.xx

Не удалось установить шрифты в Windows 10

Предупреждение «Неполная финальная строка» при попытке прочитать CSV-файл в R

Приложение не удалось запустить, поскольку оно не могло найти или загрузить плагин платформы QT «windows»,

Как связать два разных интернет-соединения

Как вы теперь импортируете проект Eclipse в Android Studio?

Предотвращение вырезания и вставки из / в RDP-клиент

Разница между дисплеем: inline-flex и display: flex

Что означает @hide в исходном коде Android?

Давайте будем гением компьютера.