2011-02-17 19 views
18

Estoy tratando de filtrar una matriz mediante un predicado de comprobación de archivos que terminan en un conjunto de extensiones. ¿Cómo podría hacerlo?NSPredicar endswith archivos múltiples

¿Algo parecido a 'self endswith in% @' funciona? ¡Gracias!

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

Respuesta

63

Usted no quiere que contiene una matriz, que desea en. También idealmente desea filtrar por la extensión de ruta. Entonces

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

+1 muy superior a mi respuesta. No puedo creer que no haya pensado en esto. Felicitaciones a usted. –

+0

¡Increíble! ¡Gracias! –

+0

+1, realmente increíble! – EmptyStack

3

edición respuesta de Martin es muy superior a éste. La suya es la respuesta correcta.


Hay varias formas de hacerlo. Probablemente el más simple sería más que construir un predicado gigante O:

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

Esto creará un predicado que es equivalente a:

SELF ENDSWITH '.mp4' OR SELF ENDSWITH '.mov' OR SELF ENDSWITH '.m4v' OR .... 
Cuestiones relacionadas