Xcode 4.4发行说明中提到的“Objective-C Literals”有哪些细节?

我正在阅读Xcode 4.4的发行说明,并注意到这一点:

LLVM 4.0编译器

Xcode现在包含Apple LLVM Compiler版本4.0,包括以下newObjective-C语言特性:
– Objective-C文字:为NSArray,NSDictionary和NSNumber创build文字,就像NSString的文字一样

我对这个function很感兴趣。 我不完全清楚NSString文字是如何工作的,以及如何在NSArrayNSDictionaryNSNumber上使用它们。

有什么细节?

http://cocoaheads.tumblr.com/post/17757846453/objective-c-literals-for-nsdictionary-nsarray-和逐字复印:;

Objective-C文字:现在可以为NSArray,NSDictionary和NSNumber创build文字(就像可以为NSString创build文字一样)

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 Literals

先前:

 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; 

[编辑]

http://news.ycombinator.com/item?id=3672744的; zxoq增加了更有趣的新的下标。 (附加文字):

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

[编辑2]

新的ObjC文字在多个WWDC 2012会议中进行了讨论。 我故意没有删除每个幻灯片的文件名和时间,所以你可以find他们自己,如果你觉得。 他们本质上是一样的东西,在这篇文章中,但也有一些新的东西,我会在图像上面提到。

请注意,图像都很大。 只需拖动到另一个选项卡查看它们的原始大小

文字和拳击

 [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] 

@#号,@ {}字典,@“”字符串,@ []数组,@()表达式


这部分是新的。 expression文字

当你有一个expression式(例如M_PI / 16 )时,你应该把它放在括号内。

这个语法适用于数字expression式,布尔值,在(C-)string中find索引,布尔值,枚举常量,甚至string!

表达文字

 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") ); 

有关string的更多信息以及如何/何时可以使用此字面语法:

盒装的字符串表达式

 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; } 

[编辑3]

Mike Ash对这些新的文字有很好的写作。 如果你想知道更多关于这个东西,一定要检查出来 。


Objective-C编译器已经硬编码了NSConstantString类实例的内存布局的知识,也就是__CFConstantString类。 在clang源代码中检查lib/Rewrite/RewriteModernObjC.cpp中的RewriteObjCStringLiteral函数。 编译器只发出匹配NSConstantString类的实例布局的数据。

对于文字NSArrayNSDictionary实例有几种可能性。 他们可以做类似于字面string的事情 – 在编译器中对实例布局(对于特殊的子类)进行硬编码,并在该布局中发送数据。 或者他们可以让编译器发出简单的在运行时创build一个实例的代码。

从“Objective-C文字”

1) Xcode 4.4提供NSNumberNSDictionaryNSArray文字。

2) NSDictionaryNSArray需要“ Xcode 4.4OS X 10.8更高版本SDK ”或“ Xcode 4.5iOS 6更高版本SDK

看起来像下标脚本需要运行时支持,因此在iOS6之前不会工作。