在编写代码时,总会遇到一些Foundation框架的类,分别是NSString,NSNumber,NSArray,NSDictionary。如你所见是我们最最经常用到的几个类,众所周知Object-C的语法友好中透露的是繁杂,所以现在有Swift来简化,但Swift还远没有Object-C成熟,这里只说字面量,为了简化这些Foundation框架的类,所以尽可能的使用字面量。
1.字面数值
为了把整数,浮点数,布尔类型放入对象中,我们多用NSNumber,按照语法我们会这么做:
NSNumber *myNumber = [NSNumber numberWithInt:10];
上面是把一个数字放入对象中,用字面量的话:
NSNumber *myNumber = @10;
如此简单,代码简洁明了,包括浮点数,字符:
NSNumber *myFloat = @10.f; NSNumber *myChar = @'a'; NSNumber *myBool = @YES;
以上字面量非常有用,极大的简化了代码。
2.字面量数组
数组是常用的数据结构,不使用字面量要这么创建数组:
NSArray *myArray = [NSArray arrayWithObjects:@"one",@"two",@"three",nil];
使用字面量时这么创建:
NSArray *myArray = @[@"one",@"two",@"three"];
这种做法不仅简单,还易于操作,比如要取数组中第二个:
NSString *two = myArray[1];
通过下标就可以轻松取出来,而不需要使用很长的代码,如:
NSString *two = [myArray objectAtIndex:1];
但是在使用字面量时要注意一点,中间不能出现nil,否则会抛出异常,我们知道arrayWithObjects依次处理各个参数,直到nil结束,如果在中间位置出现一个nil,而我们不知情的话,数组中的元素就会只有nil之前的那些,使用字面量时对象是给定的,就不会出现为nil的情况,相对来说更为的安全。
3.字面量字典
字典中的是键值对,是一种映射型数据结构,正常创建时:
NSDictionary *myDic = [NSDictionary dictionaryWithObjectsAndKeys:@"Codeliu",@"myName",[NSNumber numberWithInt:26],@"myAge",nil];
很多人在写字典的时候都会遇到写反的情况,正常我们是键->对象,这里是对象->键,刚好是反的,这种写法不易读,改用字面量的话:
NSDictionary *myDic = @{@"myName":@"Codeliu",@"myAge":@26};
不仅有冒号一一对应,就连顺序也是合理的,非常好看懂。而且你会看到年龄直接是以对象的形式放进去的,与数组一样的一点是,一旦发现nil的键值就会立刻停止。
在访问字典时,传统做法是:
NSString *myName = [myDic objectFoeKey:@"myName"];
字面量的做法是:
NSString *myName = myDic[@"myName"];
是不是觉得简明易懂,更易读了呢。
4.可变数组与字典
当数组和字典的对象是可变的时,也可以通过访问下标的方法来修改和访问其中的元素。修改可变数组和字典中元素:
[mutableArray replaceObjectAtIndex:0 withObject:@"one1"]; [mutableDic setObject:@"CodingFire" forKey:@"myName"];
用字面量取下标操作如下:
mutableArray[0] = @"one1"; mutableDic[@"myName"] = @"CodingFire";
5.字面量的局限性
虽然字面量有如上很多作用和好处,但字面量并不是万能的,除字符串外,若是自定义了这些类的子类,则无法用字面量语法创建其对象,只能使用传统的方法了,因为NSArray,NSDictionary,NSNumber都是已经定型的“子族”,所以很少会有人来定义其子类,也没有那个必要,另外,字面量语法创建出来的字符串,数组,字典都是不可变的,如果想要其可变,需要复制一份:
NSMutableArray *mutableArray = [@[@"one",@"two",@"three",nil]mutableCopy];
虽然这样会多调用一个方法并创建了一个对象,但是其好处不容置疑。
注:对于用来存储不确定元素数量的解析数据,还是需要用传统方法。