Nil*_*her 19 c arrays foreach loops objective-c
我在数据结构类"Foo"中有NSMutableArray*子节点,它是许多其他类的超类,如"Bar1"和"Bar2".该数组存储Bar1和Bar2对象,以从Foo获得类似树的递归父子结构子类.要访问数组中的对象,我使用Objective-C中的foreach循环遍历它们:
for(Foo *aFoo in children) {
...
}
Run Code Online (Sandbox Code Playgroud)
但是我经常只需要遍历数组中具有某个类的对象,在这种情况下,我想为数组子类中的类Bar1的每个对象执行一个任务.使用for(子节点中的Bar1*anObject)再次循环遍历所有对象,而不仅仅是具有类Bar1的对象.有没有办法实现我的需要?
unb*_*eli 41
您必须遍历所有对象并在循环内进行类型检查.
for(id aFoo in children) {
if ([aFoo isKindOfClass:[Bar1 class]])
...
}
}
Run Code Online (Sandbox Code Playgroud)
Jas*_*oco 12
你可以这样做:
NSPredicate* bar1Predicate = [NSPredicate predicateWithFormat:@"SELF.class == %@", [Bar1 class]];
NSArray* bar1z = [children filteredArrayUsingPredicate:bar1Predicate];
for(Bar1* bar in children) {
// do something great
}
Run Code Online (Sandbox Code Playgroud)
然而,重要的是要注意,这不适用于许多标准的Cocoa类,如NSString,NSNumber等,它们使用类集群或特殊实现类(例如,任何与CoreFoundation类型无桥接的免费类),因为课程不完全匹配.但是,只要该类确实是Bar1的实例,这将适用于您定义的类.
强调注意:用户@Alex建议可能不清楚这些类必须与我上面的注释完全匹配,所以我重申了这一点.这些类必须完全匹配才能使此过滤器正常工作,因此如果您继承Bar1或提供某些代理类,则必须调整过滤器才能包含这些类.如上所述,仅Bar1在过滤后的数组中返回实例.