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

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

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

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

19
задан Nils Fischer 14 June 2010 в 13:46
поделиться

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 будут возвращены в отфильтрованный массив.

12
ответ дан 30 November 2019 в 02:29
поделиться

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

for(id aFoo in children) {
    if ([aFoo isKindOfClass:[Bar1 class]])
        ...
    }
}
41
ответ дан 30 November 2019 в 02:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: