Objective-C 入门(三)对象字面量

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/


你可能感兴趣的:(Objective-C,NSDictionary,NSArray,nsnumber,对象字面量)