使用该对象的属性之一查找数组中对象的索引

时间:2012-07-01 09:48:19

标签: objective-c cocoa-touch nsarray

我有一个NSMutableArray pages,其中包含多个对象(Page个实例)。每个Page实例都有一个UUID和其他属性,例如内容。当page更改时,除UUID外,一切都可能发生变化。更改后,我想使用Page找出pages中特定indexOfObject:的索引。我使用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];

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

- (NSIndexSet *)indexesOfObjectsPassingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicateindexOfAccessibilityElement:<#(id)#>但我不确定其中任何一个可以帮助我解决问题。

3 个答案:

答案 0 :(得分:3)

isEqual:中对Page方法进行子类化,如下所示:

- (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中声明   protocol)返回YES。

答案 1 :(得分:2)

来自NSArray docs:

  

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

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

- (BOOL)isEqual:(id)object {
    if (![object isKindOfClass:[Page class]]) {
        return NO;
    }

    Page *otherPage = object;
    return [self.uuid isEqualToString:otherPage.uuid];
}

答案 2 :(得分:0)

可以通过这种方式使用谓词,假设pages是所有页面的数组:

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

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

NSUInteger indexOfPage = [pages indexOfObject:theObject];

相关问题