Object C 对象字面量,是clangv3.1(对应Apple LLVM 4.0)引入的一项新特性(clang,再写这篇文章是,最新版本是v3.3).
主要有一下几点:
1.NSNumber字面量:从标量(scalar)字面量表达式中创建NSNumber。
2.集合字面量:创建数组和字典的简写方式。
3.Object-C 对象的下表索引
一:NSNumber字面量:示例代码如下(注释的事对象字面量的写法):
void nsnumberLiterals(){ NSNumber *boolYES = [NSNumber numberWithBool:YES]; NSNumber *boolNO = [NSNumber numberWithBool:NO]; NSNumber *charX = [NSNumber numberWithChar:'X']; NSNumber *fortySevenInt = [NSNumber numberWithInt:47]; NSNumber *fortySevenUnsigned = [NSNumber numberWithUnsignedInt:47U]; NSNumber *fortySevenLong = [NSNumber numberWithLong:47L]; NSNumber *goldenRatioFloat = [NSNumber numberWithFloat:1.61803F]; NSNumber *goldenRatioDouble = [NSNumber numberWithDouble:1.61803]; // Using object literals,the above can be rewritten as simple: // NSNumber *boolYES = @YES; // NSNumber *boolNO = @NO; // NSNumber *charX = @'X'; // NSNumber *fortySevenInt = @47; // NSNumber *fortySevenUnsigned = @47U; // NSNumber *fortySevenLong = @47L; // NSNumber *goldenRatioFloat = @1.61803F; // NSNumber *goldenRatioDouble = @1.61803; NSLog(@"boolYES:%@",boolYES); NSLog(@"boolNO:%@",boolNO); NSLog(@"charX:%@",charX); NSLog(@"fortySevenInt:%@",fortySevenInt); NSLog(@"fortySevenUnsiged:%@",fortySevenUnsigned); NSLog(@"fortySevenLong:%@",fortySevenLong); NSLog(@"goldenRatioFloat:%@",goldenRatioFloat); NSLog(@"goldenRatioDouble:%@",goldenRatioDouble); // NSLog Result /** 2013-01-12 13:33:40.652 Demo[771:303] boolYES:1 2013-01-12 13:33:40.655 Demo[771:303] boolNO:0 2013-01-12 13:33:40.656 Demo[771:303] charX:88 2013-01-12 13:33:40.658 Demo[771:303] fortySevenInt:47 2013-01-12 13:33:40.659 Demo[771:303] fortySevenUnsiged:47 2013-01-12 13:33:40.660 Demo[771:303] fortySevenLong:47 2013-01-12 13:33:40.661 Demo[771:303] goldenRatioFloat:1.61803 2013-01-12 13:33:40.661 Demo[771:303] goldenRatioDouble:1.61803 */ }
这里面还要注意Object-C的新语法:自动装箱表达式。
格式:@(<expression>)
例如我们可以这样使用NSNumber字面量:
NSNumber *maxInt = @INT_MAX;
但是不能这样写:
NSNumber *smallestInt = @INT_MIN;// 现在的编译好像可以,没什么错,可能是定义变了。
因为他们的定义如下:
#define INT_MAX 2147483647 /* max value for an int */
#define INT_MIN (-2147483647-1) /* min value for an int */
INT_MIN并不是一个简单的字面量,而是一个有括号的表达式。
这个时候就是使用自动装箱表达式语法的时候了:
NSNumber *smallest = @(INT_MIN);
二:集合类型字面量:
(1)数组字面量:
void nsarrayLiterals(){ // old syntax for creating an NSArray: NSArray *instruments = [NSArray arrayWithObjects:@"Ocarina",@"Flute",@"Harp", nil]; NSArray *newinstruments = @[@"Ocarina",@"Flute",@"Harp"]; NSMutableArray *instrumentsMutable = [newinstruments mutableCopy]; NSLog(@"old syntax,instruments:%@",instruments ); NSLog(@"new object literals,instruments:%@",newinstruments); NSLog(@"mutalbeCopy:%@",instrumentsMutable); // NSLog result /** 2013-01-12 13:42:35.912 Demo[830:303] old syntax,instruments:( Ocarina, Flute, Harp ) 2013-01-12 13:42:35.914 Demo[830:303] new object literals,instruments:( Ocarina, Flute, Harp ) 2013-01-12 13:42:35.915 Demo[830:303] mutalbeCopy:( Ocarina, Flute, Harp ) */ }(2)字典字面量:
void collectionSubscripting(){ NSArray *keys = @[@"name",@"sex",@"age"]; NSDictionary *myInfo2 = @{@"name" : @"banxi1988",@"sex":@"male",@"age":@47 }; // traditional form NSString* keyForName = [keys objectAtIndex:0]; NSString* name = [myInfo2 objectForKey:keyForName]; NSLog(@"keyForName:%@",keyForName); NSLog(@"name:%@",name); //With the new,subscripting capability you can just do this: NSString *keyForSex =keys[1]; NSString *sex = myInfo2[keyForSex]; NSLog(@"keyForSex:%@",keyForSex); NSLog(@"sex:%@",sex); // NSlog result /* 2013-01-12 14:15:28.808 Demo[1153:303] keyForName:name 2013-01-12 14:15:28.811 Demo[1153:303] name:banxi1988 2013-01-12 14:15:28.812 Demo[1153:303] keyForSex:sex 2013-01-12 14:15:28.813 Demo[1153:303] sex:male */ }
三:Object-C对象下表索引。
void collectionSubscripting(){ NSArray *keys = @[@"name",@"sex",@"age"]; NSDictionary *myInfo2 = @{@"name" : @"banxi1988",@"sex":@"male",@"age":@47 }; // traditional form NSString* keyForName = [keys objectAtIndex:0]; NSString* name = [myInfo2 objectForKey:keyForName]; NSLog(@"keyForName:%@",keyForName); NSLog(@"name:%@",name); //With the new,subscripting capability you can just do this: NSString *keyForSex =keys[1]; NSString *sex = myInfo2[keyForSex]; NSLog(@"keyForSex:%@",keyForSex); NSLog(@"sex:%@",sex); // NSlog result /* 2013-01-12 14:15:28.808 Demo[1153:303] keyForName:name 2013-01-12 14:15:28.811 Demo[1153:303] name:banxi1988 2013-01-12 14:15:28.812 Demo[1153:303] keyForSex:sex 2013-01-12 14:15:28.813 Demo[1153:303] sex:male */ }
参考来源:
1.http://clang.llvm.org/docs/ObjectiveCLiterals.html
2.http://mobile.tutsplus.com/tutorials/iphone/objective-c-literals/