1

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

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];

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

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

4

3 回答 3

3

子类化isEqual:方法Page如下:

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

    return [self.UUID isEqualToString: otherPage.UUID];
}

然后indexOfObject:将正常工作。

来自Apple 的 NSArray 文档

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

于 2012-07-01T09:59:34.980 回答
2

来自 NSArray 文档:

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

因此,您可以覆盖isEqual:以便YES在两个页面具有相同 UUID 时返回。

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

    Page *otherPage = object;
    return [self.uuid isEqualToString:otherPage.uuid];
}
于 2012-07-01T09:57:40.047 回答
0

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

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

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

NSUInteger indexOfPage = [pages indexOfObject:theObject];

于 2012-07-01T09:55:11.350 回答