NSP предикат заканчивается несколькими файлами - PullRequest
18 голосов
/ 17 февраля 2011

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

Будет ли работать что-то близкое к 'self в% @' ? Спасибо!

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]
    ]];

Ответы [ 2 ]

63 голосов
/ 17 февраля 2011

Вы не хотите содержать для массива, вы хотите в. Вы также в идеале хотите фильтровать по расширению пути.Итак

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]];
3 голосов
/ 17 февраля 2011

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 ....
...