我有一个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))predicate
或indexOfAccessibilityElement:<#(id)#>
但我不确定其中任何一个可以帮助我解决问题。
答案 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];