2011-02-17 1 views
18

私は、一連の拡張子で終わるファイルをチェックする述部を使って配列をフィルタリングしようとしています。どうすればいい?NSPredicateが複数のファイルで終わる

に近いものがありますか?%@ 'の自己終了?ありがとう!

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

答えて

63

あなたがしたくないことはあなたがしたい、配列のために含まれています。理想的には、パス拡張でフィルタリングすることもできます。だから

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私の答えにはるかに優れています。私はこれを考えなかったとは信じられません。あなたへの誇り。 –

+0

素晴らしい!ありがとう! –

+0

+1、本当に素晴らしいです! – EmptyStack

3

編集マーティンの答えは、この1よりはるかに優れています。彼は正しい答えです。


これにはいくつかの方法があります。おそらく最も簡単なだけの巨大なOR述語を構築するために、次のようになります。

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 .... 
関連する問題