Objective c 使用数组中的某个对象查找该对象的索引';s属性
我有一个Objective c 使用数组中的某个对象查找该对象的索引';s属性,objective-c,cocoa-touch,nsarray,Objective C,Cocoa Touch,Nsarray,我有一个NSMutableArray页面,其中包含多个对象(页面的实例)。每个页面实例都有一个UUID和其他属性,例如内容。当页面更改时,除了UUID之外,所有内容都可能更改。更改后,我想使用indexOfObject:在pages中查找特定页面的索引。我使用UUID来识别我正在寻找的索引,这很好: NSMutableArray *uuids = [[NSMutableArray alloc] init]; for (int i = 0; i < [self.pages count]; i
NSMutableArray
页面
,其中包含多个对象(页面的实例)。每个页面
实例都有一个UUID和其他属性,例如内容。当页面
更改时,除了UUID之外,所有内容都可能更改。更改后,我想使用indexOfObject:
在pages
中查找特定页面的索引。我使用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];
NSMutableArray*uuids=[[NSMutableArray alloc]init];
对于(int i=0;i<[self.pages count];i++){
[uuids添加对象:[[pages objectAtIndex:i]uuid]];
}
NSUInteger indexOfPage=[uuids indexOfObject:page.uuid];
现在我的问题是,是否有一种更优雅的方式来做到这一点。我真正需要的是pages
中具有给定UUID的Page
对象的索引
有
-(NSIndexSet*)indexesOfObjectsPassingTest:(BOOL(^)(id obj,NSUInteger idx,BOOL*stop))谓词
或indexOfAccessibilityElement:
但我不确定这两种方法如何帮助我解决问题。可能是通过使用谓词实现的,假设页面是所有页面的数组:
predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"(UUID == %@)", searchUUID]];
filteredArray = [pages filteredArrayUsingPredicate:predicate];
一旦您拥有了对象(假设您的uuid是唯一的,该对象应该位于筛选数组中的objectAtIndex:0),您可以询问该对象的索引:
NSUInteger IndexOffPage=[pages IndexOffObject:theObject] 可能是通过使用谓词实现的,假设页面是所有页面的数组:
predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"(UUID == %@)", searchUUID]];
filteredArray = [pages filteredArrayUsingPredicate:predicate];
一旦您拥有了对象(假设您的uuid是唯一的,该对象应该位于筛选数组中的objectAtIndex:0),您可以询问该对象的索引:
NSUInteger IndexOffPage=[pages IndexOffObject:theObject] 来自NSArray文档:
数组的每个元素都会发送一条isEqual:
消息,直到找到匹配项或到达数组的末尾
因此,您可以覆盖isEqual:
,以便在两个页面具有相同的UUID时返回YES
- (BOOL)isEqual:(id)object {
if (![object isKindOfClass:[Page class]]) {
return NO;
}
Page *otherPage = object;
return [self.uuid isEqualToString:otherPage.uuid];
}
从NSArray文档:
数组的每个元素都会发送一条isEqual:
消息,直到找到匹配项或到达数组的末尾
因此,您可以覆盖isEqual:
,以便在两个页面具有相同的UUID时返回YES
- (BOOL)isEqual:(id)object {
if (![object isKindOfClass:[Page class]]) {
return NO;
}
Page *otherPage = object;
return [self.uuid isEqualToString:otherPage.uuid];
}
将页面
中的isEqual:
方法子类化如下:
- (BOOL) isEqual: (Page *) otherPage
{
if (![otherPage isKindOfClass:[Page class]]) {
return NO;
}
return [self.UUID isEqualToString: otherPage.UUID];
}
然后indexOfObject:
将正常工作
发件人:
从索引0开始,数组的每个元素都被发送一个等质量:
消息,直到找到匹配项或到达数组末尾。
此方法将anObject参数传递给每个isEqual:消息。
如果在NSObject中声明isEqual:,则对象被视为相等
协议)返回YES
将页面
中的isEqual:
方法子类化如下:
- (BOOL) isEqual: (Page *) otherPage
{
if (![otherPage isKindOfClass:[Page class]]) {
return NO;
}
return [self.UUID isEqualToString: otherPage.UUID];
}
然后indexOfObject:
将正常工作
发件人:
从索引0开始,数组的每个元素都被发送一个等质量:
消息,直到找到匹配项或到达数组末尾。
此方法将anObject参数传递给每个isEqual:消息。
如果在NSObject中声明isEqual:,则对象被视为相等
协议)返回YES
谢谢赫贾齐。只是想知道我是否真的需要这门课。我已经实现了Ahsley的,它工作得很好,但也许你的答案是正确的和省钱的。你们能解释一下为什么你们要检查这门课吗?以防万一。因此,当我访问uuid
时,我知道它在那里,并且我不会与另一个类的对象进行比较。谢谢Hejazi。只是想知道我是否真的需要这门课。我已经实现了Ahsley的,它工作得很好,但也许你的答案是正确的和省钱的。你们能解释一下为什么你们要检查这门课吗?以防万一。因此,当我访问uuid
时,我知道它在那里,并且我没有与另一个类中的对象进行比较。