Подтвердить что ты не робот

Objective-C NSMutableArray - цикл foreach с объектами нескольких классов

У меня есть дети NSMutableArray * в классе datastructure "Foo", который является суперклассом многих других, таких как "Bar1" и "Bar2". Этот массив хранит объекты Bar1 и Bar2 для получения древовидной рекурсивной родительской-дочерней структуры подклассов из Foo. Чтобы получить доступ к объектам в массиве, я просматриваю их с помощью цикла foreach в Objective-C:

for(Foo *aFoo in children) {
    ...
}

Но часто мне нужно только прокручивать объекты в массиве с определенным классом, в этом случае я хочу выполнить задачу для каждого объекта класса Bar1 в дочерних элементах массива. Использование for (Bar1 * anObject в дочерних элементах) снова пересекает ВСЕ объекты, а не только классы с классом Bar1. Есть ли способ достичь того, что мне нужно?

4b9b3361

Ответ 1

Вам нужно перебрать все объекты и выполнить проверку типа внутри цикла.

for(id aFoo in children) {
    if ([aFoo isKindOfClass:[Bar1 class]])
        ...
    }
}

Ответ 2

Вы можете сделать что-то вроде этого:

NSPredicate* bar1Predicate = [NSPredicate predicateWithFormat:@"SELF.class == %@", [Bar1 class]];
NSArray* bar1z = [children filteredArrayUsingPredicate:bar1Predicate];
for(Bar1* bar in children) {
  // do something great
}

Важно отметить, что это не будет работать со многими стандартными классами Cocoa, такими как NSString, NSNumber и т.д., которые используют кластеры классов или специальные классы реализации (например, все, CoreFoundation), поскольку классы не будут точно соответствовать. Однако это будет работать с определенными вами классами, если класс действительно является экземпляром Bar1.

Акцент Примечание. Пользователь @Alex предположил, что может быть неясно, что классы должны точно совпадать с моим примечанием выше, поэтому я повторяю это. Классы должны точно соответствовать этому фильтру, поэтому, если вы подклассифицируете Bar1 или предоставляете некоторый прокси-класс, вам придется настроить фильтр, чтобы эти классы были включены. Как записано, в фильтрованном массиве будут возвращаться только экземпляры Bar1.