Effective-Objective-C-读书笔记-Item-3

前言

item 3讲的是Objective-C里面的“字面量语法”-“Literal Syntax”,个人觉得非常有用。

Item 3 - Prefer Literal Syntax over the Equivalent Methods

本节讲了Objective-C中的“字面量语法”,并且建议我们更多的使用这种语法,而不是使用传统的等价的函数方法。

引子

当我们使用Objective-C编程的时候,总会经常使用到几种Foundation框架中的基本类,如NSString、NSNumber、NSArray、NSDictionary,或者是它们的子类。例如,当我们想创建一个字符串的时候,会这么写:

1
NSString *str = @"a string";

不知道各位写这句的时候有没有觉得奇怪?为什么不用先“alloc”,再“initWithXXX”这么来创建呢。是的,这里创建字符串,就用到了Objective-C提供的“字面量语法”-“Literal Syntax”,而这种语法的“标志”就是“@”符号。
有了字面量语法,我们就不用每次创建一些基本类型的时候,写一大堆alloc、init了。

NSNumber

字符串可以用字面量语法创建,数字类NSNumber肯定也可以,如下:

1
2
3
4
5
6
7
8
NSNumber *intNum = @1;
NSNumber *floatNum = @1.1f;
NSNumber *doubleNum = @1.1;
NSNumber *boolNum = @YES;
NSNumber *charNum = @'a';

//不用字面量语法
NSNumber *intNumber = [[NSNumber alloc] initWithInt:1];

看,是不是很方便~

NSArray

创建

数组算是最常用的一种数据结构了,如果没有字面量语法,创建数组可能是这样:

1
NSArray *numbers = [[NSArray alloc] initWithObjects:@1, @1.1, @2.0f, @YES, nil];

用字面量语法的话,就是这样:

1
NSArray *numbers = @[@1, @1.1, @2.0f, @YES];

存取值

创建了数组,肯定要从数组里面取值,用NSArray的方法就是这样:

1
2
3
4
5
//取
NSNumber *aNumber = [numbers objectAtIndex:2];
//存
NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithArray:@[@1, @2, @3]];
[mutableArray replaceObjectAtIndex:1 withObject:@4];

跟C语言、Java这些语法很不一样啊,人家都是通过中括号“[]”直接用下标取值就可以。有了字面量同语法,Objective-C也可以这样:

1
2
3
4
5
//取
NSNumber *aNumber = numbers[2];
//存
NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithArray:@[@1, @2, @3]];
mutableArray[1] = @4;

要注意的地方

传统的通过“initWithObjects”方法创建数组的时候,是根据最后的“nil”判断数组是否结束的,也就是说,用于初始化数组的元素中有“nil”值也不会导致异常(Exception),如下语句:

1
2
3
4
5
6
7
8
9
10
NSNumber *number1 = @1;
NSNumber *number2 = nil; //空指针
NSNumber *number3 = @3;

//创建
NSArray *numbers = [[NSArray alloc] initWithObjects:
number1, number2, number3, nil];

//输出为1,因为number2,创建到number2就截止了
NSLog(@"numbers count: %d", numbers.count);

但是,如果用字面量语法创建,就是出问题:

1
2
3
4
5
6
7
8
NSNumber *number1 = @1;
NSNumber *number2 = nil;
NSNumber *number3 = @3;

//创建出现异常!!!
NSArray *numbers = @[number1, number2, number3];

NSLog(@"numbers count: %d", numbers.count);

因为字面量语法只是单纯的将中括号中的元素全部加到数组中,但是,Objective-C中的数组是不可以存放nil值的,所以程序会运行时抛出异常。

NSDictionary

创建

如果不用字面量语法创建字典,传统的创建函数简直令人匪夷所思:

1
2
3
// number1->@1
// number2->@2
NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:@1, @"number1", @2, @"number2", nil];

是不是很奇怪,value在前面,key在后面

所以,还是用新的语法吧:

1
NSDictionary *dict = @{@"number1" : @1, @"number2" : @2};

这样才符合“常识”嘛,key在前,value在后面,跟JSON的定义一样。

存取值

取值的语法跟NSArray的语法很想,只不过是将下标数字变成了key:

1
2
3
4
5
6
7
//传统
NSNumber *number1 = [dict objectForKey:@"number1"];
[dict setValue:@5 forKey:@"number1"];

//字面量语法
NSNumber *number2 = dict[@"number1"];
dict[@"number1"] = @6;

注意

需要注意的地方,跟创建数组一样,NSDictionary的value不能为nil值,否则会抛出异常。

总结

总的来说,使用字面量语法可以让代码更加清晰、简单,毕竟,更少的代码,有时候意味着更少的错误。

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器