我的第一反应是
FooType *myFoo = nil;
for (id obj in myArray) {
if ( [obj isKindOfClass:[FooType class]] ) myFoo = obj;
}
在Objective-C和NSArray中有很多好东西,肯定有更好的方法,对吧?
我的第一反应是
FooType *myFoo = nil;
for (id obj in myArray) {
if ( [obj isKindOfClass:[FooType class]] ) myFoo = obj;
}
在Objective-C和NSArray中有很多好东西,肯定有更好的方法,对吧?
iOS 4或Snow Leopard支持Blocks:
FooType *myFoo = nil;
NSUInteger index = [myArray indexOfObjectPassingTest:^BOOL (id obj, NSUInteger idx, BOOL *stop) {
return [obj isKindOfClass:[FooType class]];
}];
if (index != NSNotFound) myFoo = [myArray objectAtIndex:index];
其实并没有更加简短。您可以考虑编写自己的NSArray
方法来实现此操作。
像jtbandes所提到的,如果你需要经常这样做,你可以将NSArray
方法编写为类别。类似于这样:
@interface NSArray (FindClass)
- (NSMutableArray *) findObjectsOfClass:(Class)theClass
@end
那么
@implementation NSArray (FindClass)
- (NSMutableArray *) findObjectsOfClass:(Class)theClass {
NSMutableArray *results = [[NSMutableArray alloc] init];
for (id obj in self) {
if ([obj isKindOfClass:theClass])
[results addObject:obj];
}
return [results autorelease];
}
@end
当你想使用它时,只需执行以下操作:
NSMutableArray *objects = [myArray findObjectsOfClass:[FooType class]];
这个变量应该包含指定类的所有对象。
免责声明:未经测试,如果有错误请见谅 :/
不是的。那就是你该怎么做。虽然在新的iOS4 API中可能有一个接受块的版本,这可能会使它变得更简单一些。