Objective-C 之 Literals(字面量)

今天整理一下关于Objective-C Literals的内容,Literals翻译成字面量或者字面值,就是直接被写到源代码中的值。这不是一个陌生的概念,我们在写程序的时候能频繁的见到。我们很早就见过NSString 字面量了: 

 
 
 
 
NSString *greeting = @"Hello World";

它的语法很简单,上面的代码就是通过在C字符串的前面加上@符号创建了一个NSString对象greeting,整段代码看起来简洁易懂,如果没有直接量语法,那么创建这个greeting可能就要使用下面的方法了: 

1 NSString *greeting = [NSString stringWithUTF8String:"Hello World"];

    在Xcode4.4和LLVM4.0之后,一些新特性被提出来,其中一个就是对NSNumber、NSArray和NSDictionary使用字面量语法。

    NSNumber

    在新特性提出来之前,我们要创建的一个NSNumber对象可能是这样的: 

1 NSNumber  *aNumber = [NSNumber  numberWithInt:22];

    那么现在就可以这样写: 

1 NSNumber  *aNumber = @22;

    当然这里不仅对于 -numberWithInt:适用,对于其他的也同样适用: 

 1 //不用字面量的方式:
 2 NSNumber *aBool = [NSNumber numberWithBool:YES];
 3 NSNumber *aChar = [NSNumber numberWithChar:'a'];
 4 NSNumber *aUnsigned = [NSNumber numberWithUnsignedInt:22U];
 5 NSNumber *aLong = [NSNumber numberWithLong:27L];
 6 NSNumber *aFloat = [NSNumber numberWithFloat:3.14F];
 7 NSNumber *aDouble = [NSNumber numberWithDouble:3.14];
 8  
 9 //字面量的写法
10 NSNumber *aBool = @YES;
11 NSNumber *aChar = @'a';
12 NSNumber *aUnsigned = @22U;
13 NSNumber *aLong = @27L
14 NSNumber *aFloat = @3.14F;
15 NSNumber *aDouble = @3.14;

     除此之外,你还可以用表达式: 

1 NSNumber *result = @(2+3*4);

    NSArray

    不使用字面量语法的时候,创建一个数组通常是这样的: 

1 NSArray *aArray = [NSArray arrayWithObjects: [NSNumber numberWithInt:22], @"kuntzuo", @"hello", nil];

    而有了字面量语法之后,就可以这样写: 

1 NSArray *aArray = @[@22, @"kuntzuo", @"hello"];

    创建数组的字面量的方式变得更加简洁了,在方括号前面加上字面量@符号 ,里面写上内容,而且不再需要nil作为结束标志了,如果没有去掉nil会得一个警告,运行时会报错。

     NSDictionary

     创建一个NSDictionary的传统方式是这样: 

 1 NSArray *keys   = [NSArray arrayWithObjects:@"Name", @"Sex", @"Age", nil];
 2  
 3 NSArray *objects = [NSArray arrayWithObjects:@"kuntzuo", @"", [NSNumber numberWithInt:22], nil];
 4  
 5 NSDictionary *myProfile = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
 6  
 7 //或者是
 8  
 9 NSDictionary *myProfile = [NSDictionary dictionaryWithObjectsAndKeys:
10  
11                            @"kuntzuo ", @"Name",
12  
13                            @"", @"Sex",
14  
15                            [NSNumber numberWithInt:22], @"Age",
16  
17                            nil];

     以上两种方法看起来都不简单,而且容易混乱。字面量语法给我们更好的可选项,看看下面写法: 

1 NSDictionary *myProfile = @{"Name":"kuntzuo","Sex":"","Age":@22};

     除了用字面量来创建NSArray、NSNumber、NSDictionary之外。如果集合是可变类型如 

NSMutableArray、NSMutableDictionary,新特性还允许你用下标的方式来访问和修改集合中的值。下面的代码简单演示了这一特性。 

 1 //对于上面的NSArray *aArray
 2 NSArray *aArray = @[@22, @"kuntzuo", @"hello"];
 3 NSMutableArray *mutableArray = [@[@22, @"kuntzuo", @"hello"] mutableCopy];
 4  
 5 //传统访问方式
 6 NSString *greeting = [mutableArray objectAtIndex:2]; //"hello"
 7 //新方法访问
 8 NSString *greeting = mutableArray[2]; // "hello"
 9 //新方法修改
10 mutableArray[2] = @"hello world";
11  
12  
13 //对于上面的NSDictionary
14 NSDictionary *myProfile = @{"Name":"kuntzuo","Sex":"","Age":@22}
15 NSMutableDictionary *mutableDic = [myProfile mutableCopy];
16 //传统访问方式
17 NSString *name = [mutableDic objectForKey:@"Name"]; // "kuntzuo"
18 //新方法访问
19 NSString *myName = mutableDic[@"Name"];//"kuntzuo"
20 //新方法修改
21 mutableDic[@"Name"] = @"kuntian zuo";

    这就是我所了解的Literals的全部内容,虽然现在也不算新东西了,不过我们掌握它还是很有必要的,既方便我们写代码,也可以是代码的可读性更高,风格更好。

posted @ 2015-03-01 10:36  苏叶  阅读(203)  评论(0编辑  收藏  举报