开发iOS应用时经常要用到数组,现在开始深入学习数组的相关知识。
Objective-C中的数组可以存储不同类型的对象,虽然items数组目前只存储BNRItem对象,但是也可以存储NSDate对象或其他对象。这一点和很多强类型(strongly-typed)语言不同,这些语言的数组只能保存一种类型的对象。
数组对象只能保存指向Objective-C对象的指针,所以不能将基本类型(primitive)的变量或C结构加入数组对象。如果要将基本类型的变量和C结构加入数组,可以先将它们“包装”成Objective-C对象,例如NSNumber、NSValue和NSData。
注意,不能将nil加入数组对象。如果要将“空洞”加入数组对象,就必须使用NSNull对象。NSNull对象的作用就是代表nil,所以可以用来解决这类问题,代码如下:
[items addObject:[NSNull null]];
访问数组中的对象时,可以向数组对象发送objectAtIndex:消息,它会返回指定索引的对象,但是这种语法非常繁琐,还有一种更简洁的下标语法:
NSString *foo = items[0];
这行代码与发送objectAtIndex:消息的效果是相同的:
NSString *foo = [items objectAtIndex:0];
下面在BNRItem.m中使用下标语法重新实现randomItem方法。
+ (instancetype)randomItem
{
...
NSString *randomName = [NSString stringWithFormat:@"%@ %@",
[randomAdjectiveList objectAtIndex:adjectiveIndex],
[randomNounList objectAtIndex:nounIndex]];
NSString *randomName = [NSString stringWithFormat:@"%@ %@",
randomAdjectiveList[adjectiveIndex],
randomNounList[nounIndex]];
int randomValue = arc4random % 100;
...
return newItem;
}
构建并运行应用,检查控制台中的输出结果是否和之前的结果相同。
方括号的嵌套层数越多,代码的可读性就越差。因为方括号的作用可能不同,容易产生混淆:有的是发送消息,有的是存取方法,有的是访问数组中的对象。坚持使用点语法和下标语法可以清晰地突出消息发送代码,也可以避免代码过于冗长。
与点语法和存取方法的关系相同,下标语法和objectAtIndex:消息编译后的结果也是一样的,编译器会自动将下标语法转换为objectAtIndex:消息。
在NSMutableArray中,可以使用下标语法向数组中添加和修改对象。
NSMutableArray *items = [[NSMutableArray alloc] init];
items[0] = @"A"; // Add @"A"
items[1] = @"B"; // Add @"B"
items[0] = @"C"; // Replace @"A" with @"C"
这几行代码等价于向items发送insertObject:atIndex:和replaceObject- AtIndex:withObject:消息。