【问题标题】:How to get the last object of an NSArray如何获取 NSArray 的最后一个对象
【发布时间】:2011-11-02 18:23:33
【问题描述】:

所以我有一个数组,其中项目的数量可能会有所不同。我想知道是否有办法获得NSArray 的最后一个对象?我确实想过有一个int 计数器来跟踪数组中的项目数量,但这似乎太麻烦了。

有谁知道这比这更好吗?

【问题讨论】:

  • 如果由于某种原因不想使用[Array lastObject],也可以使用[NSArray objectAtIndex:[Array count]-1];,但其他方法更简洁。

标签: objective-c cocoa nsarray


【解决方案1】:

稍微扩展一下这个问题,有几种情况可能需要数组的最后一个对象,但获取它的方式不同。

在一个直接的 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" 格式

【讨论】:

  • 我怎么没看到……谢谢。既然你先回答了,我会把你标记为正确的
  • 如果数组为空则返回 nil。
【解决方案2】:
[yourArray lastObject];

documentation

【讨论】:

    【解决方案3】:

    可能是这样的:

    id object = [myArray lastObject];
    

    一个好的提示是选择并单击您要阅读文档的任何符号。例如,按住 option 键并单击 Xcode 编辑器中显示 NSArray 的任何文本。

    您会看到一个包含基础知识的漂亮弹出窗口,以及完整详细文档的链接。

    【讨论】:

      【解决方案4】:

      或者如果你想变得花哨:

      yourArray.lastObject 
      

      【讨论】:

      • lastObject 不是属性。点符号用于属性。我不知道为什么编译器允许这样做。
      • @vikingosegundo 点符号只是调用方法的糖衣。因此,虽然使用点符号调用任何方法都是有效的,但它被认为是不好的做法。
      • @qegal 可以调用不带任何参数的点符号的方法,试试看。
      猜你喜欢
      • 1970-01-01
      • 2012-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多