Objective-C NSMutableArray - 具有多个类对象的foreach循环

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)

  • 不,它不会改变你的内存占用,你只是在阅读已经在内存中的东西 (5认同)
  • 通常,如果需要使用`isKindOfClass:`来区分集合中的类,那么您的设计模式就超出了常规.如果您的集合包含完全属于您创建的类的实例,则尤其如此. (3认同)

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在过滤后的数组中返回实例.

  • @unbeli:它完全可以在iPhone上使用,而不是OP完全提到了iPhone. (2认同)