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
文字是如何工作的,以及如何在NSArray
, NSDictionary
和NSNumber
上使用它们。
有什么细节?
从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
类的实例布局的数据。
对于文字NSArray
和NSDictionary
实例有几种可能性。 他们可以做类似于字面string的事情 – 在编译器中对实例布局(对于特殊的子类)进行硬编码,并在该布局中发送数据。 或者他们可以让编译器发出简单的在运行时创build一个实例的代码。
从“Objective-C文字”
1) Xcode 4.4提供NSNumber
, NSDictionary
和NSArray
文字。
2) NSDictionary
和NSArray
需要“ Xcode 4.4和OS X 10.8或更高版本SDK ”或“ Xcode 4.5和iOS 6或更高版本SDK ”
看起来像下标脚本需要运行时支持,因此在iOS6之前不会工作。