如何查找数组是否包含对象(不使用for循环)?

时间:2011-10-17 10:08:35

标签: iphone objective-c ios nsarray

我使用下面的代码来检查ary_navigationControllerViews数组是否包含myclass对象或者它的工作正常但是我需要for for循环。我知道我们有像containsObject这样的方法,但是在这种情况下如何使用。有没有办法检查这个条件没有使用for循环。

NSArray *ary_navigationControllerViews = [[NSArray alloc] initWithArray:[self.navigationController viewControllers]];
    for(id obj_viewController in ary_navigationControllerViews) {
        if([obj_viewController isKindOfClass:[myClass  class]]) {
            //some my code
            return;
        }
    }

4 个答案:

答案 0 :(得分:12)

NSPredicate 让这类工作变得更加简单。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY SELF.class.description == %@", [[myClass class] description]];
BOOL exists =  [predicate evaluateWithObject:ary_navigationControllerViews];
if (exists) {
    //some my code
    return;
}

要获取视图控制器实例,可以使用以下代码。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.class.description == %@", [[self class] description]];
NSArray *vcs = [ary_navigationControllerViews filteredArrayUsingPredicate:predicate];
if ([vcs count] > 0) {
    id vc = [vcs objectAtIndex:0];
    // Now vc is the view controller you are looking for
}

答案 1 :(得分:3)

您可以使用块:

NSArray *arr = [NSArray arrayWithObjects:[NSString stringWithFormat:@"test"], [NSNumber numberWithInt:10], [NSNull null], nil];
__block int index = NSNotFound;
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if ([obj isKindOfClass:[NSNumber class]])
    {
        index = idx;
        *stop = YES;
    }
}];
if (index != NSNotFound)
{
    NSLog(@"contains at %d", index);
}

例如,在您的情况下:

[ary_navigationControllerViews enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if ([obj isKindOfClass:[myClass class]])
    {
        //some my code
        *stop = YES;
    }
}];

但我不认为这会降低你的代码的复杂性。循环是最简单的

答案 2 :(得分:3)

或者,根据Nekto的回答,你也可以像这样直接返回索引:

NSArray *arr = [NSArray arrayWithObjects:[NSString stringWithFormat:@"test"], [NSNumber numberWithInt:10], [NSNull null], nil];

int index = [arr indexOfObjectPassingTest:^(id obj, NSUInteger idx, BOOL *stop) {
    if ([obj isKindOfClass:[NSNumber class]])
    {
        *stop = YES;
       return YES;
    }

    return NO;
}];
if (index != NSNotFound) 
{
    NSLog(@"contains at %d", index);
}

享受。

答案 3 :(得分:1)

如果你真的不能为此使用for循环那么你将不得不使用像indexesOfObjectsPassingTest:这样的方法,它将一个块应用于数组中的每个对象并返回一个NSIndexSet数组中的项目。然后,您可以使用它来返回仅通过测试的对象的新数组:

check = ^ (id obj, NSUInteger idx, BOOL *stop) 
{
    return [obj isKindOfClass:[myClass class]];
};

NSIndexSet *objectsInMyClass = [[self.navigationController viewControllers] indexesOfObjectsPassingTest:check];

NSArray *filteredArray = [[self.navigationController viewControllers] objectsAtIndexes:objectsInMyClass];

然后,您可以使用makeObjectsPerformSelector或类似内容来实际执行您的特定代码。