iOS - 巧用字面量语法

318 阅读3分钟

在编写代码时,总会遇到一些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];

虽然这样会多调用一个方法并创建了一个对象,但是其好处不容置疑。
注:对于用来存储不确定元素数量的解析数据,还是需要用传统方法。