我们在编写Objective-C代码时要尽量使用字面量语法,不仅使代码更简单,同事也更易读懂。我们可以用alloc及init方法来分配并初始化NSString对象,也可以这样写:
NSString *someString = @"Objective-C字面量语法总结";
也能用这种字面量语法来声明NSNumber、NSArray、NSDictionary类的实例。使用字面量语法(literal syntax)可以缩减源代码长度,使其更为易读。
字面量数值NSNumber
不使用字面量创建NSNumber类型:
NSNumber *someNumber = [NSNumber numberWithInt:1];
使用字面量创建NSNumber类型:
NSNumber *someNumber = @1;
能够以NSNumber实例表示的所有数据类型都可使用该语法。例如:
NSNumber *intNumber = @1;
NSNumber *floatNumber = @2.5f;
NSNumber *doubleNumber = @3.14159;
NSNumber *boolNumber = @YES;
NSNumber *charNumber = @'a';
字面量数组NSArray
不使用字面量创建NSArray类型:
NSArray *animals =
[NSArray arrayWithObjects:@"cat", @"dog",
@"mouse", @"badger", nil];
使用字面量创建NSArray类型:
NSArray *animals = @[@"cat", @"dog", @"mouse", @"badger"];
在数组中通过下表来取某个对象时,不使用字面量语法:
NSString *dog = [animals objectAtIndex:1];
使用字面量语法:
NSString *dog = animals[1];
此外,使用字面量语法更为安全。例如:
id object1 = @1;
id object2 = nil;
id object3 = @3;
//arrayWithObjects
NSArray *arrayA = [NSArray arrayWithObjects:object1, object2, object3, nil];
//字面量语法
NSArray *arrayB = @[object1, object2, object3];
上面这段代码按字面量语法创建数组arrayB时会抛出异常。arrayA虽然能创建出来,但是其中却只含有object1一个对象。原因在于,“arrayWithObjects:”方法会依次处理各个参数,直到发现nil为止,由于object2是nil,所以该方法会提前结束。抛出异常令应用程序终止执行,这比创建好数组之后才发现元素个数少了要好。向数组中插入nil通常说明程序有错,而通过异常可以更快地发现这个错误。
字面量字典Dictionary
不使用字面量创建Dictionary类型:
NSDictionary *personData =
[NSDictionarydictionaryWithObjectsAndKeys:
@"Matt", @"firstName",
@"Galloway", @"lastName",
[NSNumber numberWithInt:28], @"age",
nil];
使用字面量创建Dictionary类型:
NSDictionary *personData =
@{@"firstName" : @"Matt",
@"lastName" : @"Galloway",
@"age" : @28};
可见字面量语法更简明,理解也比较顺畅,因为比较符合我们键——值的习惯。
字典也可以像数组那样用字面量语法访问。按照特定键访问其值的传统做法是:
NSString *lastName = [personData objectForKey:@"lastName"];
与之等效的字面量语法则是:
NSString *lastName = personData[@"lastName"];
可变数组与字典mutableArray & mutableDictionary
修改可变数组与字典内容的标准做法是:
[mutableArray replaceObjectAtIndex:1 withObject:@"dog"];
[mutableDictionary setObject:@"Galloway"forKey:@"lastName"];
若换用取下标操作来写,则是:
mutableArray[1] = @"dog";
mutableDictionary[@"lastName"] = @"Galloway";
使用字面量语法创建出来的字符串、数组、字典对象都是不可变的(immutable)。若想要可变版本的对象,则需复制一份:
NSMutableArray *mutable = [@[@1, @2, @3, @4, @5]mutableCopy];