Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 使用数组中的某个对象查找该对象的索引';s属性_Objective C_Cocoa Touch_Nsarray - Fatal编程技术网

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
时,我知道它在那里,并且我没有与另一个类中的对象进行比较。