У меня есть NSMutableArray *дети в datastructure-классе "Нечто", которое является суперклассом многих других, как "Bar1" и "Bar2". Тот массив хранит Bar1, и Bar2 возражает для получения древовидной рекурсивной родительской дочерней структуры подклассов от Foo. Для доступа к объектам в массиве я циклично выполняюсь через них использующий цикл foreach в Objective C:
for(Foo *aFoo in children) {
...
}
Но часто я только должен циклично выполниться через объекты в массиве, которые имеют определенный класс, в этом случае я хочу выполнить задачу для каждого объекта класса Bar1 в детях массива. Используя для (Bar1 *anObject в детях) снова циклы через ВСЕ объекты и не только тех с классом Bar1. Существует ли способ достигнуть того, в чем я нуждаюсь?
Вы можете сделать что-то вроде этого:
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
будут возвращены в отфильтрованный массив.
Вы должны перебрать все объекты и сделать проверку типа внутри цикла.
for(id aFoo in children) {
if ([aFoo isKindOfClass:[Bar1 class]])
...
}
}