Filtrar Array

Cuando se tene un Array de algún tipo de dato, se puede filtrar la colección para obtener solamente los elementos dentro de la misma que cumplan con algún criterio.

struct User {
    let name: String
    let age: Int
}

let users: [User] = [
    .init(name: "Oscar", age: 24),
    .init(name: "Marco", age: 12),
    .init(name: "Mariana", age: 21),
    .init(name: "Omar", age: 38),
    .init(name: "Sergio", age: 26),
    .init(name: "Matt", age: 22),
    .init(name: "Louie", age: 56),
    .init(name: "Diana", age: 18),
]

let namesStartingWithM = users.filter { (user) -> Bool in
    return user.name.hasPrefix("M")
}

// #=> [{name "Marco"}, {name "Mariana"}, {name "Matt"}]

En el ejemplo anterior, se utiliza la función filter(isIncluded: (Element) throws -> Bool) para obtener nada más los usuarios cuyos nombres comienzan con la letra “M”.

Puesto que filter(isIncluded:) recibe una función que determinará el criterio con el que se discriminarán los objetos de la colección, se puede hacer cualquier cosa para determinar qué se busca obtener.

El siguiente ejemplo, se obtienen solamente los usuarios con mayoría de edad para poder beber en Estados Unidos.

let usersThatCanDrink = users.filter { (user) -> Bool in
    return user.age > 21
}

// #=> [{name "Oscar", age 24}, {name "Omar", age 38}, {name "Sergio", age 26}, {name "Matt", age 22}, {name "Louie", age 56}]

El ejemplo anterior se puede refactorizar al encapsular la lógica de discriminación en una función externa, y pasar dicha función como parámetro a filter(isIncluded:):

func canDrink(user: User) -> Bool {
    return user.age > 21
}

let usersThatCanDrink = users.filter(canDrink(user:))

// #=> [{name "Oscar", age 24}, {name "Omar", age 38}, {name "Sergio", age 26}, {name "Matt", age 22}, {name "Louie", age 56}]