配列を filter して新しい配列を得たい。Swift で言う所の、次のようなコード。
let array = [1,2,3,4,5,6]
let newArray = array.filter { $0 % 2 == 0 }
Objective-C で書こうとするとループを回すしかないのかな? なんて思ってた。こんな感じに。
NSArray *numbers = @[@1, @2, @3, @4, @5, @6];
NSMutableArray *tmp = [NSMutableArray new];
for (NSNumber *n in numbers) {
if (n.integerValue %2 == 0) {
[tmp addObject:n];
}
}
NSArray *newArray = [tmp copy];
NSLog(@"even numbers: %@", newArray);
even numbers: (
2,
4,
6
)
そしたら filteredArrayUsingPredicate:
というメソッドがあることを知った。上のコードは次のように書ける。
NSArray *numbers = @[@1, @2, @3, @4, @5, @6];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"modulus:by:(SELF, 2) == 0"];
NSArray *evenNumbers = [numbers filteredArrayUsingPredicate:predicate];
NSLog(@"even numbers: %@", evenNumbers);
even numbers: (
2,
4,
6
)
7 行のコードがたったの 2 行になった。頑張れば 1 行でも書けそう。
Swift ほどのシンプルさはないし、NSPredicate を使いこなせないといけないけれど、極めれば便利に使えそう。
modulus:by:
は NSExpression.h の中に載っていた。
No comments:
Post a Comment