天天看点

第三条:多使用字面量语法

应该使用字面量语法来创建字符串,数值,数组,字典。

应该通过取下标操作来访问数组下标或是字典中的键所对应的元素。

我们经常用到的有Foundation框架中的NSString,NSNumber,NSArray,NSDictionary。

这条经验告诉我们要多使用字面量来创建上述这些类。

比如说NSString,何为字面量创建呢?

@"hello"; //这就是一个字面量
NSString* words = @"how are you!";
           

像上面这样的创建方式就叫做使用字面量创建。

NSString* words = [[NSString alloc]init...];
           

相比这样的创建方式,上面那种有何好处呢?

1.缩减代码量;

2.使代码更加易读,简洁。

实际上,当我们直接使用字面量语法的时候,都是程序在背后帮我们进行了alloc init方式的创建。这被称为是“语法糖”。

语法糖:指计算机语言中与另外一套语法等效,但是开发者使用起来更加方便的语法。

接下来将要描述的其他三个类都有着这样的语法。

Wait!

还有一条关于NSString的小技巧。在C++中我们知道,可以使用字面量拼接的语法。像是这样:

const char* str = "hello" "word";
           

那么在OC中呢?同样也可以使用这样的语法。

NSString* strs =  @"hello" @"world";
NSString* strs1 = @"hello" "world";
NSString* strs2 = @"hello"
                  @"world"
                   "!";
           

至于具体可以用到哪些地方呢?数据库查询语算是一个,可以分成好几行,使代码更加清晰。

NSNumber

将基本数据类型放到数组或是字典中的时候,我们就需要对其进行包装成类。

若不使用字面量,则是

NSNumber* num = [NSNumber numberWithInt:123];
           

如果使用字面则只需要:

NSNumber* num1 = @1;
NSNumber* num2 = @3.14;
NSNumber* num3 = @YES;
NSNumber* num4 = @'a';
...
           

就是这么easy,一眼就看到了具体数值。

NSArray:

一般创建方法及取下标方法:

NSArray* arr =[NSArray arryWithObjects:@"tom",@"jeny",@"frank",nil];
           
[arr objectAtIndex:1];
           

使用字面量:

NSArray* arr = @[@"tom",@"tim",@"frank"];
           
arr[1];
           

这种方式不仅简单易写,还有利于操作数组。

注意:我们在使用字面量创建数组的时候,如果插入的某个对象为nil,则会报错。正是如此我们在使用字面量创建数组的时候可以更早的发现错误。如果使用本身的方法创建的,则会在遇到nil时结束添加,而不会报错,这样会导致数组元素数量变少。不容易及时发现。

NSDictionary

NSDictionary *personData=[NSDictionary dictionaryWithObjectsAndKeys:
@"Matt",@"firstName",@"Galloway",@"lastName",[NSNumber numberWithInt:28],@"age",nil];
           

这样key在后obj在前的方式貌似有点反逻辑?而且整个代码还很冗余的感觉。

使用了字面量之后:

NSDictionary *personData = @{@"firstName":@"Matt",@"lastName":@"Galloway",@"age":@28};
           

瞬间清爽了!是吧?

同样的这样的添加方法也会在有对象为nil时报错,有助于查错;而是用本身的方法则不会。

访问key的具体内容呢?

NSString *lastName=[personData objectForKey:@"lastName"];
           
NSString *lastName=personData[@"lastName"];
           

哪个更好用一比便知。

要明白的: 

1.字面量语法是很好用,但是仅限于Foundation框架内的对象才行,自定义对象是不行的哦。好在这个框架里的对象已经基本涵盖我们所需要的对象了。

2.使用字面量创建出来的字符串,数组,字典对象都是不可变的,如需要可变版本则需要使用mutablecopy方法。

但是总的来说,使用字面量的优点大于它的瑕疵。