使用字面量语法(literal syntax)可以缩减源代码长度,使其更易读。
- 字面数值
有时需要把整数、浮点数、布尔值封入 OC 对象中,这种情况下可以用 NSNumber 类,该类可以处理多种类型的数值。
// 不用字面量,创建一个数字
NSNumber *someNumber = [NSNumber numberWithInt:1];
// 使用字面量
NSNumber *someNumber = @1;
NSNumber 实例表示的所有数据类型都可使用该语法,代码:
NSNumber *intNumber = @1;
NSNumber *floatNumber = @2.5f;
NSNumber *doubleNumber = @3.1415;
NSNumber *boolNumber = @YES;
NSNumber *charNumber = @'a';
字面量表示数值可以令 NSNumber 对象变得整洁(因为声明中只包含数值,而没有多余的成分)。
- 字面量数组
// 不使用字面量语法创建数组,取下标操作
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,会抛出异常。
原因:字面量语法实际上只是一种“语法糖”,其效果等于先创建一个数组,然后把方括号内的所有对象都加到这个数组。
字面量语法更安全:抛出异常令应用程序终止,比创建好数组后才发现元素个数少了好。向数组中插入 nil 通常说明程序有错。
- 字面量字典
// 不使用字面量语法定义的字典,取值操作
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"];
注:字典中的对象和键必须都是 OC 对象,不能把整数直接放进去,要封装成 NSNumber 实例。
字面量定义的字典,若值为 nil,也会抛出异常。
- 可变数组与字典
[mutableArray replaceObjectAtIndex:1 withObject:@"dog"];
[mutableDictionary setObject:@"Hello" forKey:@"lastName"];
// 下标操作
mutableArray[1] = @"dog";
mutableDictionary[@"lastName"] = @"Hello";
- 局限性
字面量语法局限:除了字符串,所创建对象必须属于 Foundation 框架。
使用字面量语法创建的字符串、数组、字典对象都是不可变的(immutable),若想变成可变的,需复制一份,例如:
NSMutableArray *mutable = [@[@"cat", @"dog", @"monkey"] copy];
要点:
- 使用字面量语法来创建字符串、数值、数组、字典,与常规方法相比更加简明扼要。
- 通过取下标操作访问数组下标或字典中的键所对应的元素。
- 用字面量语法创建数组或字典时,值中有 nil 会抛出异常。
语法糖(syntactic sugar):也称“糖衣语法”,计算机语言中与另一套语法等效但是开发者用起来却更加方便的语法。语法糖可令程序更易读,减少代码出错概率。