NSURL の配列を本当にフィルタリングしたい場合は、次のようにすることができます。
- (NSArray *)filteredArray:(NSArray *)originalArray withSubpath:(NSString *)subpath {
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
NSURL *url = (NSURL *)evaluatedObject;
NSRange range = [[url path] rangeOfString:subpath];
return (range.location == 0);
}];
return [originalArray filteredArrayUsingPredicate:predicate];
}
これが私がそれをテストした方法です:
NSArray *urls = @[[NSURL URLWithString:@"Animals/Birds/file1.xyz"],
[NSURL URLWithString:@"Animals/Birds/file2.xyz"],
[NSURL URLWithString:@"Animals/Cats/file1.xyz"],
[NSURL URLWithString:@"Cars/Ford/file1.xyz"]];
NSLog(@"Before: %@", urls);
urls = [self filteredArray:urls withSubpath:@"Animals/Birds"];
NSLog(@"After: %@", urls);
出力ログは次のとおりです。
Before: (
"Animals/Birds/file1.xyz",
"Animals/Birds/file2.xyz",
"Animals/Cats/file1.xyz",
"Cars/Ford/file1.xyz"
)
After: (
"Animals/Birds/file1.xyz",
"Animals/Birds/file2.xyz"
)
注: 部分文字列に一致するため、この場合、先頭のスラッシュのために "/Animals" には一致しません (配列と部分文字列の両方に「/」が含まれていない限り)。