使用字面量方法来创建字符串、数值、数组、字典,与创建此类对象的常规方法相比,这么做更加简明扼要
字面数值
将整数, 浮点数,布尔值封入对象,可用NSNumber
类
NSNumber *intNumber = @1;
NSNumber *floatNumber = @2.5f;
NSNumber *doubleNumber = @3.14159;
NSNumber *boolNumber = @YES;
NSNumber *charNumber = @'a';
//表达式
NSInteger x = 5;
CGFloat y = 6.32f;
NSNumber *expressionNumber = @(x*y);
字面数组
// 不使用字面量语法创建数组,取下标操作
NSArray *animals = [NSArray arrayWithObjects:@"cat", @"dog", @"monkey", nil];
NSString *dog = [animals objectAtIndex:1];
// "arrayWithObjects:" 方法会依次处理各个参数,直到发现 nil
// 字面量语法
NSArray *animals = @[@"cat", @"dog", @"monkey"];
NSString *dog = animals[1]; //“取下标”(subscripting)操作
注意: 若数组元素对象中有nil,则会抛出异常。
id object1 = /* ... */;
id object2 = /* ... */;
id object3 = /* ... */;
NSArray *arrayA = [NSArray array WithObjects:
object1, object2, object3, nil];
NSArray *arrayB = @[object1, object2, object3];
/**
大家想想:如果object1与object3都指向了有效的Objective-C对象,而object2是nil,那么会出现什么情况呢?按字面量语法创建数组arrayB时会抛出异常。arrayA虽然能创建出来,但是其中却只含有object1一个对象。原因在于,“arrayWithObjects:”方法会依次处理各个参数,直到发现nil为止,由于object2是nil,所以该方法会提前结束。
这个微妙的差别表明,使用字面量语法更为安全。抛出异常令应用程序终止执行,这比创建好数组之后才发现元素个数少了要好。向数组中插入nil通常说明程序有错,而通过异常可以更快地发现这个错误。
*/
原因: 字面量语法实际上只是一种“语法糖”,其效果等于先创建一个数组,然后把方括号内的所有对象都加到这个数组。
字面量语法更安全: 抛出异常令应用程序终止,比创建好数组后才发现元素个数少了好。向数组中插入 nil 通常说明程序有错。
字面字典
字典中的对象和键必须都是Objective-C对象
// 不使用字面量语法定义的字典,取值操作
NSDictionary *personData = [NSDictionary dictionaryWithObjectsAndKeys:
@"Thomas", @"firstName",
@"Jefferson", @"lastName",
[NSNumber numberWithInt:28], @"age",
nil];
NSString *firstName = [personData objectForKey:@"firstName"];
// 字面量语法定义
NSDictionary *personData = @{ @"firstName" : @"Thomas",
@"lastName" : @"Jefferson",
@"age" : @28
};
NSString *firstName = personData[@"firstName"];
注意1: 不能把整数直接放进去,要封装成 NSNumber 实例。
注意2: 与数组一样,字面量定义的字典,若值为 nil,也会抛出异常。
可变数组与字典
通过取下标操作,可以访问数组中某个下标或字典中某个键所对应的元素。如果数组与字典对象是可变的(mutable),那么也能通过下标修改其中的元素值。
mutableArray[1] = @"dog";
mutableDictionary[@"lastName"] = @"Galloway";
字面量语法的局限性
-
除了字符串,所创建对象必须属于 Foundation 框架(NSString,NSNumber,NSArray,NSDictionary这几个类均属于Foundation框架)
-
使用字面量语法创建出来的字符串、数组、字典对象都是不可变的(immutable)。若想要可变版本的对象,则需复制一份。
NSMutableArray *mutableArray = [@[@1, @2, @3, @4, @5] mutableCopy];
要点
-
应该使用字面量语法来创建字符串、数值、数组、字典。与创建此类对象的常规方法相比,这么做更加简明扼要。
-
应该通过取下标操作来访问(修改)数组下标或字典中的键所对应的元素。
-
用字面量语法创建数组或字典时,若值中有nil,则会抛出异常。因此,务必确保值里面不含nil。