如何在NSArray中找到某种对象?

时间:2010-08-22 04:09:46

标签: objective-c nsarray

我的第一直觉是

FooType *myFoo = nil;
for (id obj in myArray) {
    if ( [obj isKindOfClass:[FooType class]] ) myFoo = obj;
}

有了Objective-C和NSArray的所有好东西,还有更好的方法,对吗?

3 个答案:

答案 0 :(得分:11)

使用Blocks支持(在iOS 4或Snow Leopard中):

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方法来执行此操作。

答案 1 :(得分:3)

就像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]];

应该包含指定类的所有对象。

免责声明:未经测试,抱歉,如果出现问题:/

答案 2 :(得分:0)

不。你就是这样做的。虽然可能有一个版本接受新iOS4 API中的块,这可能会使它更简单。