Каковы детали "литералов Objective-C", упомянутых в примечаниях к выпуску Xcode 4.4?
Я просматривал заметки о выпуске для Xcode 4.4 и заметил это:
компилятор LLVM 4.0
Xcode теперь включает в себя компилятор Apple LLVM версии 4.0, включая следующие функции языка newObjective-C:
[...]
- Objective-C literals: создание литералов для NSArray, NSDictionary и NSNumber, точно так же, как литералы для NSString
я заинтригован этой функцией. Мне это не совсем понятно просто как литералы для NSString работа и как можно использовать их на NSArray,NSDictionary и NSNumber.
какие подробности?
3 ответов:
скопировано дословно из 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;
[Edit]
zxoq at 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]
эта часть является новой. Выражения Литералы
когда у вас есть выражение (
M_PI / 16например), вы должны положить его в скобках.этот синтаксис работает для числовых выражений, логических значений, поиск индекса в строке (C -), логических значениях, константах перечисления и даже символьных строках!
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... }
как работают литералы массива
// 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 <NSCopying>)key { id oldObject = [_storage objectForKey:key]; [_storage setObject:object forKey:key]; return oldObject; }
@implementation Database { NSMutableDictionary *_storage; } - (id)replaceObject:(id)newObject forKey:(id <NSCopying>)key { id oldObject = _storage[key]; _storage[key] = newObject; return oldObject; }
[Edit 3]
Майк Золы имеет большую запись об этих новых литералах. Если вы хотите узнать больше об этом материале, убедитесь, что зацените.
компилятор Objective-C имеет жестко закодированное знание макета памяти экземпляров
NSConstantStringкласс, он же__CFConstantStringкласса. Проверьте
1)
NSNumber,NSDictionaryиNSArrayлитералы доступны в Xcode 4.4.2)
NSDictionaryиNSArrayнужен знак "Xcode 4.4 и OS X 10.8 или позже SDK" или "Xcode 4.5 и iOS 6 или позже SDK"мне кажется, что знак нуждается в поддержке во время выполнения и, следовательно, не работайте до iOS6.




![@# numbers, @{} dictionaries, @"" strings, @[] arrays, @() expressions](/images/content/9347722/a194994c81140bec132ed53be83047cb.png)










Comments