2017-02-15

Objective-C で NSArray から filter した配列を得る

配列を 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