Buscar..


Introducción

Las funciones flatMap como map , flatMap , filter , y reduce se utilizan para operar en varios tipos de colecciones como Array y Dictionary. Las funciones avanzadas normalmente requieren poco código y se pueden encadenar para construir una lógica compleja de manera concisa.

Introducción con funciones avanzadas.

Tomemos un escenario para entender mejor la función avanzada,

struct User {
    var name: String
    var age: Int
    var country: String?
}

//User's information 
let user1 = User(name: "John", age: 24, country: "USA")
let user2 = User(name: "Chan", age: 20, country: nil)
let user3 = User(name: "Morgan", age: 30, country: nil)
let user4 = User(name: "Rachel", age: 20, country: "UK")
let user5 = User(name: "Katie", age: 23, country: "USA")
let user6 = User(name: "David", age: 35, country: "USA")
let user7 = User(name: "Bob",age: 22, country: nil)

//User's array list
let arrUser = [user1, user2, user3, user4, user5, user6, user7]

Función de mapa:

Utilice el mapa para recorrer una colección y aplicar la misma operación a cada elemento de la colección. La función de mapa devuelve una matriz que contiene los resultados de aplicar una función de mapeo o transformación a cada elemento.

//Fetch all the user's name from array 
let arrUserName = arrUser.map({ $0.name }) // ["John", "Chan", "Morgan", "Rachel", "Katie", "David", "Bob"]

Función de mapa plano:

El uso más simple es como el nombre sugiere para aplanar una colección de colecciones.

// Fetch all user country name & ignore nil value.
let arrCountry = arrUser.flatMap({ $0.country }) // ["USA", "UK", "USA", "USA"]

Función de filtro:

Use el filtro para recorrer una colección y devuelva una matriz que contenga solo los elementos que coincidan con una condición de inclusión.

// Filtering USA user from the array user list.
let arrUSAUsers = arrUser.filter({ $0.country == "USA" }) // [user1, user5, user6]

// User chaining methods to fetch user's name who live in USA 
let arrUserList = arrUser.filter({ $0.country == "USA" }).map({ $0.name }) // ["John", "Katie", "David"]

Reducir:

Use Reducir para combinar todos los elementos de una colección para crear un nuevo valor único.

Swift 2.3: -

//Fetch user's total age.
let arrUserAge = arrUser.map({ $0.age }).reduce(0, combine: { $0 + $1 }) //174

//Prepare all user name string with seperated by comma 
let strUserName = arrUserName.reduce("", combine: { $0 == "" ? $1 : $0 + ", " + $1 }) // John, Chan, Morgan, Rachel, Katie, David, Bob

Swift 3: -

//Fetch user's total age.
let arrUserAge = arrUser.map({ $0.age }).reduce(0, { $0 + $1 }) //174

//Prepare all user name string with seperated by comma 
let strUserName = arrUserName.reduce("", { $0 == "" ? $1 : $0 + ", " + $1 }) // John, Chan, Morgan, Rachel, Katie, David, Bob

Aplanar matriz multidimensional

Para aplanar la matriz multidimensional en una sola dimensión, se utilizan las funciones de avance de flatMap. Otro caso de uso es ignorar el valor nulo de los valores de matriz y asignación. Vamos a ver con el ejemplo:

Supongamos que tenemos una matriz multidimensional de ciudades y queremos clasificar la lista de nombres de ciudades en orden ascendente. En ese caso podemos usar la función flatMap como:

let arrStateName = [["Alaska", "Iowa", "Missouri", "New Mexico"], ["New York", "Texas", "Washington", "Maryland"], ["New Jersey", "Virginia", "Florida", "Colorado"]]

Preparando una lista unidimensional a partir de una matriz multidimensional,

let arrFlatStateList = arrStateName.flatMap({ $0 }) // ["Alaska", "Iowa", "Missouri", "New Mexico", "New York", "Texas", "Washington", "Maryland", "New Jersey", "Virginia", "Florida", "Colorado"]

Para ordenar valores de matriz, podemos usar la operación de encadenamiento o ordenar la matriz plana. Aquí abajo el ejemplo que muestra la operación de encadenamiento,

// Swift 2.3 syntax 
let arrSortedStateList = arrStateName.flatMap({ $0 }).sort(<) // ["Alaska",     "Colorado", "Florida", "Iowa", "Maryland", "Missouri", "New Jersey", "New Mexico", "New York", "Texas", "Virginia", "Washington"]

// Swift 3 syntax
let arrSortedStateList = arrStateName.flatMap({ $0 }).sorted(by: <) // ["Alaska", "Colorado", "Florida", "Iowa", "Maryland", "Missouri", "New Jersey", "New Mexico", "New York", "Texas", "Virginia", "Washington"]


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow