Objective-Cで配列をフィルタするショートカット方法
1780 ワード
もし1つの配列の中の要素がすべて文字列であれば、私たちは条件に合ったサブ配列をフィルタしたいと思っています.例えば、「A」で始まるすべての文字列をフィルタしたいと思っています.私たちの一般的な処理方法は配列全体を遍歴し、文字列を一つ一つ比較することです.もっと速い方法はありませんか.
答えは肯定的で、述語であるNSPredicateで迅速なフィルタリングを実現することができます.次のコードに示します.
上のコードで配列に「A」または「a」を含む文字列をフィルタできます.
NSPredicateは、次のコードに示すように、CoreDataのクエリーでも使用されます.
答えは肯定的で、述語であるNSPredicateで迅速なフィルタリングを実現することができます.次のコードに示します.
NSArray *locations = [NSArray arrayWithObjects:@"Apple", @"Orange", @"box", @"candan", @"kenrl", nil];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(SELF contains[cd] %@)", @"A"];
NSArray *results = [locations filteredArrayUsingPredicate:predicate];
NSLog(@"results:%@", results);
上のコードで配列に「A」または「a」を含む文字列をフィルタできます.
NSPredicateは、次のコードに示すように、CoreDataのクエリーでも使用されます.
SetApp;
NSManagedObjectContext *context = [app managedObjectContext];
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:[NSEntityDescription entityForName:@"CoreFilterList" inManagedObjectContext:context]];
[request setPredicate:[NSPredicate predicateWithFormat:@"listName like %@", name]];
NSError *err = nil;
NSArray *ret = [context executeFetchRequest:request error:&err];
if(err != nil) {
NSLog(@"DB error: %@", [err description]);
}
return ret;