稍微扩展一下这个问题,有几种情况可能需要数组的最后一个对象,但获取它的方式不同。
在一个直接的 Cocoa 程序中
如果只想在标准 Cocoa 程序的过程中获取对象,那么就可以了:
[myArray lastObject]
解决counter的顾虑——也不需要自己实现:
NSUInteger myCount = [myArray count];
使用键值编码 (KVC)
如果需要通过 KVC 访问数组的最后一个对象,这个故事需要一点解释。
首先,从数组中请求普通键的值将创建一个新数组,该数组由数组中每个对象的该键的值组成。换句话说,从数组中请求键 lastObject 将使数组使用它们上的键 lastObject 向每个对象发送 valueForKey:。除了不是预期的结果外,它还可能引发异常。
因此,如果确实需要向数组本身(而不是其内容)发送密钥,则需要在密钥前面加上@-符号。这告诉数组该键用于数组本身,而不是它的内容。
因此,密钥必须具有@lastObject 的形式,并像这样使用:
NSArray *arr = @[@1, @2, @3];
NSNumber *number = [arr valueForKey: @"@lastObject"];
在排序描述符中
如何在实际程序中使用此键的一个示例是,数组数组需要按每个内部数组中的 last 对象进行排序。
上面的key只是简单的用在排序描述符中:
NSArray *arrayOfArrays = @[@[@5, @7, @8], @[@2, @3, @4, @6], @[@2, @5]];
NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey: @"@lastObject" ascending: YES];
NSArray *sorted = [arrayOfArrays sortedArrayUsingDescriptors: @[sd]];
在谓词中
同样,为了过滤数组数组,可以直接在谓词中使用键:
NSPredicate *pred = [NSPredicate predicateWithFormat: @"self.@lastObject > 5"];
NSArray *filtered = [arrayOfArrays filteredArrayUsingPredicate: pred];
喜欢不使用self-part 的人可以简单地使用@"@lastObject > 5" 格式