【问题标题】:Finding the index of an object in an array using one of that object's properties使用该对象的属性之一在数组中查找对象的索引
【发布时间】:2012-07-01 09:48:18
【问题描述】:

我有一个 NSMutableArray pages 和几个对象(Page 的实例)。每个Page 实例都有一个UUID 和其他属性,例如内容。当 page 更改时,除了 UUID 之外的所有内容都可能更改。更改后,我想通过使用indexOfObject: 找出pages 中特定Page 的索引。我使用 UUID 来识别我正在寻找的索引,这很好用:

NSMutableArray *uuids = [[NSMutableArray alloc] init];
for (int i = 0; i < [self.pages count]; i++) {
    [uuids addObject:[[pages objectAtIndex:i] uuid]];
}

NSUInteger indexOfPage = [uuids indexOfObject:page.uuid];

现在我的问题是是否有更优雅的方式来做到这一点。我真正需要的是pages 中具有给定UUID 的Page 对象的索引。

- (NSIndexSet *)indexesOfObjectsPassingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicateindexOfAccessibilityElement:&lt;#(id)#&gt; 但我不确定这两种方法如何帮助我解决问题。

【问题讨论】:

    标签: objective-c cocoa-touch nsarray


    【解决方案1】:

    子类化Page中的isEqual:方法如下:

    - (BOOL) isEqual: (Page *) otherPage
    {
        if (![otherPage isKindOfClass:[Page class]]) {
            return NO;
        }
    
        return [self.UUID isEqualToString: otherPage.UUID];
    }
    

    然后indexOfObject: 将正常工作。

    来自Apple's NSArray documentation

    从索引 0 开始,数组的每个元素都被发送一个 isEqual: 消息,直到找到匹配项或到达数组末尾。 此方法将 anObject 参数传递给每个 isEqual: 消息。 如果 isEqual: (在 NSObject 中声明),则认为对象相等 协议)返回 YES。

    【讨论】:

      【解决方案2】:

      来自 NSArray 文档:

      数组的每个元素都会发送isEqual: 消息,直到找到匹配项或到达数组末尾。

      因此,如果两个页面具有相同的 UUID,您可以覆盖 isEqual:,使其返回 YES

      - (BOOL)isEqual:(id)object {
          if (![object isKindOfClass:[Page class]]) {
              return NO;
          }
      
          Page *otherPage = object;
          return [self.uuid isEqualToString:otherPage.uuid];
      }
      

      【讨论】:

      • 感谢 Hejazi。只是想知道我是否真的需要 isKindOfClass。我已经实现了 Ahsley,它工作得很好,但也许你的答案是正确且更省钱的。你能解释一下为什么要检查 isKindOfClass 吗?
      • 以防万一。因此,当我访问 uuid 时,我知道它就在那里,并且我不会与另一个类的对象进行比较。
      【解决方案3】:

      可以通过使用谓词来实现,假设 pages 是所有页面的数组:

      predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"(UUID == %@)", searchUUID]];
      filteredArray = [pages filteredArrayUsingPredicate:predicate];
      

      一旦你有了对象,假设你的 uuid 是唯一的,它应该在过滤数组中的 objectAtIndex:0 处,你可以询问该对象的索引:

      NSUInteger indexOfPage = [pages indexOfObject:theObject];

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-07
        • 2022-01-24
        • 1970-01-01
        • 2012-05-20
        相关资源
        最近更新 更多