Search code examples
objective-ccocoansarray

filtering NSArray into a new NSArray in Objective-C


I have an NSArray and I'd like to create a new NSArray with objects from the original array that meet certain criteria. The criteria is decided by a function that returns a BOOL.

I can create an NSMutableArray, iterate through the source array and copy over the objects that the filter function accepts and then create an immutable version of it.

Is there a better way?


Solution

  • NSArray and NSMutableArray provide methods to filter array contents. NSArray provides filteredArrayUsingPredicate: which returns a new array containing objects in the receiver that match the specified predicate. NSMutableArray adds filterUsingPredicate: which evaluates the receiver’s content against the specified predicate and leaves only objects that match. These methods are illustrated in the following example.

    NSMutableArray *array =
        [NSMutableArray arrayWithObjects:@"Bill", @"Ben", @"Chris", @"Melissa", nil];
    
    NSPredicate *bPredicate =
        [NSPredicate predicateWithFormat:@"SELF beginswith[c] 'b'"];
    NSArray *beginWithB =
        [array filteredArrayUsingPredicate:bPredicate];
    // beginWithB contains { @"Bill", @"Ben" }.
    
    NSPredicate *sPredicate =
        [NSPredicate predicateWithFormat:@"SELF contains[c] 's'"];
    [array filteredArrayUsingPredicate:sPredicate];
    // array now contains { @"Chris", @"Melissa" }