Элегантный способ получить все объекты определенного типа в массиве Objective-C - PullRequest
3 голосов
/ 23 апреля 2010

Я знаю, что могу сделать

for (id obj in array)
{
    if ([obj isKindOfClass:[Elephant class]])
        [elephants addObject:obj];
}

но я чувствую, что должен быть более элегантный способ сделать этоЯ смотрел на фильтрующие массивы, но не могу придумать хороший предикат.Мысли? * * 1004

Ответы [ 2 ]

3 голосов
/ 23 апреля 2010

Предикат будет выглядеть примерно так:

Class ec = [Elephant class];
NSPredicate *elePred = [NSPredicate predicateWithFormat:@"class==%@", ec];
NSArray *elephants = [array filteredArrayUsingPredicate:elePred];

или

NSPredicate *elePred = [NSPredicate predicateWithFormat:@"self isKindOfClass: %@", ec];

Я обнаружил, что предикаты довольно ... скажем, "тяжелые". Я бы предпочел ваш код этому.

Если вы просто хотите немного оживить свою жизнь, вы можете использовать блоки, чтобы добавить немного параллелизма ...

    NSMutableArray *results = [NSMutableArray array];
    [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
        if([obj isKindOfClass:[Elephant class]])
            [results addObject:obj];
    }];
0 голосов
/ 23 апреля 2010

Вы можете создать категорию для NSMutableArray и добавить следующий метод:

- (void)addObject:(id)anObject ifItIsKindOfClass:(Class) classObj {
    if ([anObject isKindOfClass:classObj]) {
        [self addObject:anObject];
    }
}

И просто напиши:

for (id obj in array)
{
        [elephants addObject:obj ifItIsKindOfClass:[Elephant class]];
}

Есть один плюс: многоразово .

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