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/