NSPredicate имеет несколько файлов
Я пытаюсь отфильтровать массив, используя проверку предикатов для файлов, заканчивающихся набором расширений. Как я могу это сделать?
Будет ли что-то близкое к 'self endswith в% @' работать? Спасибо!
NSArray * dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:documentsDirectoryPath error:nil];
NSArray * files = [dirContents filteredArrayUsingPredicate:
[NSPredicate predicateWithFormat:@"self CONTAINS %@",
[NSArray arrayWithObjects:@".mp4", @".mov", @".m4v", @".pdf", @".doc", @".xls", nil]
]];
Ответы
Ответ 1
Вы не хотите содержать массив, в котором вы хотите. Вы также идеально хотите фильтровать по расширению пути. Так
NSArray *extensions = [NSArray arrayWithObjects:@"mp4", @"mov", @"m4v", @"pdf", @"doc", @"xls", nil];
NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:documentsDirectoryPath error:nil];
NSArray *files = [dirContents filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"pathExtension IN %@", extensions]];
Ответ 2
edit Ответ Мартина намного превосходит этот. Его правильный ответ.
Есть несколько способов сделать это. Вероятно, самым простым было бы построить гигантский предикат ИЛИ:
NSArray *extensions = [NSArray arrayWithObjects:@".mp4", @".mov", @".m4v", @".pdf", @".doc", @".xls", nil];
NSMutableArray *subpredicates = [NSMutableArray array];
for (NSString *extension in extensions) {
[subpredicates addObject:[NSPredicate predicateWithFormat:@"SELF ENDSWITH %@", extension]];
}
NSPredicate *filter = [NSCompoundPredicate orPredicateWithSubpredicates:subpredicates];
NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:documentsDirectoryPath error:nil];
NSArray *files = [dirContents filteredArrayUsingPredicate:filter];
Это создаст предикат, эквивалентный:
SELF ENDSWITH '.mp4' OR SELF ENDSWITH '.mov' OR SELF ENDSWITH '.m4v' OR ....