关于字面量的理解(Objective-C Literals)

在编程语言中,字面量是一种表示值的记法,字符串字面量(stringliteral)是指双引号引住的一系列字符,双引号中可以没有字符,可以只有一个字符,也可以有很多个字符。

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

一、字面数值

        需要把整数、浮点数、布尔值封入到对象里。通常情况下会用到如下方法:
        NSNumber *number = [NSNumber numberWithInt:8];
        使用字面量语法后,不仅语法更简洁,还有很多好处。
        NSNumber *number = @(8);
        能够用以NSNumber实例表示的所有数据类型,都可以使用字面量语法。。。

二、字面量数组
        数组的常用创建方法如下:
NSArray *array = [NSArray arrayWithObjects:@"obj1", @"obj2", nil];
而使用字面量语法则是:
NSArray *array = @[@"obj1", @"obj2"];
数组的取下标也有字面量语法:
        NSString *obj = [array objectAtIndex:1];
        使用字面量:
        NSString *obj = array[1];
        不过使用字面量数组时,要注意不要把nil加入到数组中,否则会抛出异常。

三、字面量字典
        常用创建方式如下:
        NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"obj1", @"value1", @"obj2", @"value2", nil];
        而使用字面量语法,就比较简洁了。
        NSDictionary *dictionary = @{@"obj1": @"value1",
                                     @"obj1": @"value1"};
        字面量语法清晰表示出了,key和value的一一对应关系。但是与数组一样,字面量字典的value不能为nil,否则会出现异常。

四、字面量可变数组与字典
        对于可变的数组与字典,同样可以使用自变量语法对自变量数组,字典进行操作。
        NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionaryWithDictionary:@{@"obj1": @"value1",
                                                                                                 @"obj1": @"value1"}];
        

        mutableDictionary[@"obj3"] = @"value3";


NSNumber

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

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

    那么现在就可以这样写:

?
1
NSNumber  *aNumber = @22;

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//不用字面量的方式:
NSNumber *aBool = [NSNumber numberWithBool:YES];
NSNumber *aChar = [NSNumber numberWithChar: 'a' ];
NSNumber *aUnsigned = [NSNumber numberWithUnsignedInt:22U];
NSNumber *aLong = [NSNumber numberWithLong:27L];
NSNumber *aFloat = [NSNumber numberWithFloat:3.14F];
NSNumber *aDouble = [NSNumber numberWithDouble:3.14];
 
//字面量的写法
NSNumber *aBool = @YES;
NSNumber *aChar = @ 'a' ;
NSNumber *aUnsigned = @22U;
NSNumber *aLong = @27L
NSNumber *aFloat = @3.14F;
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
NSArray *keys   = [NSArray arrayWithObjects:@ "Name" , @ "Sex" , @ "Age" , nil];
 
NSArray *objects = [NSArray arrayWithObjects:@ "kuntzuo" , @ "男" , [NSNumber numberWithInt:22], nil];
 
NSDictionary *myProfile = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
 
//或者是
 
NSDictionary *myProfile = [NSDictionary dictionaryWithObjectsAndKeys:
 
                            @ "kuntzuo " , @ "Name" ,
 
                            @ "男 " , @ "Sex" ,
 
                            [NSNumber numberWithInt:22], @ "Age" ,
 
                            nil];

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

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

     写起来方便看起来爽有木有,这样的形式看起来是不是很熟悉呢?像JavaScript的对象?像JSON?反正我觉得方便很多啦。


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

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

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

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







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值