Как найти объект определенного вида в NSArray? - PullRequest
6 голосов
/ 22 августа 2010

Мой первый инстинкт -

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

Со всеми вкусностями в Objective-C и NSArray, должен быть лучший способ, верно?

Ответы [ 3 ]

11 голосов
/ 22 августа 2010

С поддержкой блоков (в 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 метод для этого.

3 голосов
/ 22 августа 2010

Как упоминалось в 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]];

, который должен содержать все объектыуказанный класс.

Отказ от ответственности: не проверено, извините, если что-то не так: /

0 голосов
/ 22 августа 2010

Неа.Вот как ты это сделаешь.Хотя может быть версия, которая принимает блок в новом API iOS4, что может сделать его немного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...