NSString对象
从Objective-C 1.0开始,有一种简单的方式能创建NSString对象,这就是”字符串字面量”,语法如下:
NSString *str = @"hello word!";
如果不用这种语法的话,就要使用常见的alloc和init来分配并初始化NSString对象。使用字面量语法能够缩短源代码长度,使其更为易读。
字面数值NSNumber
有时候需要将整数,浮点数,布尔变量存入Objective-C对象中。这种情况下可以使用NSNumber类,该类可以处理多种类型的变量。如果不用字面量,那就需要使用如下方法:
NSNumber *num = [NSNumber numberWithInt:1];
然而使用字面量语法,则更为简洁:
NSNumber *intNum = @1;
NSNumber *floatNum = @1.75f;
NSNumber *doubleNum = @3.1415926;
NSNumber *boolNum = @YES;
NSNumber *charNum = @'a';
字面量同时也适用如下表达式:
int a = 2;
float b = 3.5f;
NSNumber *expressionNum = @(a * b);
这样做让NSNumber对象变得整洁,因为声明中只包含数值,而没有多余的语法成分。
字面量数组NSArray
数组是常用的数据结构。如果不使用字面量,那么就要这么来创建数组:
NSArray *array = [NSArray
arrayWithObjects:@"dog",@"cat",nil];
而使用字面量语法来创建的话,则是
NSArray *array =@[@"dog",@"cat"];
上面的做法不仅简单,还利于操作数组。例如:
NSString *dog = [array objectAtIndex:0];
若使用字面量,则是:
NSString *dog = array[0];
这也叫作”取下标”操作。不过,用字面量语法创建数组时要注意,若数组元素对象中有nil,则会抛出异常,因为字面量语法实际上是一种”语法糖”,其效果等于先创建了一个数组,然后把方括号内的所有对象都加到这个数组。看一组例子:
id object1 = @"123";
id object2 = nil;
id object3 = @"456";
NSArray *arrayA = [NSArray
arrayWithObjects:object1,object2,object3,nil];
NSArray *arrayB = @[object1,object2,object3];
按照字面量语法,arrayB会抛出异常,而arrayA虽然能创建数组,但是数组中只有object1一个对象,原因是arrayWithObjects:会依次处理各个参数,直到发现nil为止,由于object2是nil,所以该方法会提前结束。
这个微妙的差别表明,使用字面量语法更为安全。抛出异常令程序终止,这比创建好数组,才发现数组中元素个数少了要好。
字面量字典NSDictronary
字典的标准创建方法如下:
NSDictronary *dic = [NSDictronary
dictronaryWithObjectsAnyKeys:@"Mary",@"firstName" ,
@"Gally",@"lastName",
[NSNumber numberWithInt:28],@"age",
nil];
这样写就令人困惑了,<对象>,<键>这与通常理解的顺序相反。因此,这样的语法不容易读懂。如果改为字面量语法,就好多了。
NSDictronary *dic = @{@"firstName",@"Mary",
@"lastName",@"Gally",
@"age",@28};
这样理解就顺畅多了,代码也比较简洁。
与数组存在的问题一致,那就是一旦有nil值存在,就会抛出异常,原理与数组一致。
字典也可以像数组那样用字面量语法访问。传统做法是:
NSString *lastName = [dic objectForKey:@"lastName"];
与之等效的字面量语法是:
NSString *lastName = dic[@"lastName"];
代码简单易读。
小结
字面量有个小小的限制,就是除了字符串以外,所创建出来的对象必须是Founcation框架才行。如果自定义了这些类的子类,则无法用字面量语法创建其对象。