我使用下面的代码来检查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;
}
}
答案 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
或类似内容来实际执行您的特定代码。