Filtro de matriz en Swift3

Tengo un trozo de código. No entiendo lo que está dentro de este código. ¿Alguien puede explicarlo?

let wordFreqs = [("k", 5), ("a", 7), ("b", 3)] let res = wordFreqs.filter( { (e) -> Bool in if e.1 > 3 { return true } else { return false } }).map { $0.0 } print(res) 

Da salida:

 ["k","a"] 

Si tomamos las partes de este código una después de la otra:

 let wordFreqs = [("k", 5), ("a", 7), ("b", 3)] 

Comienzas con una matriz de tuplas .

De la documentation de Swift:

Un tipo de tupla es una list de types separados por comas, entre paréntesis.

y:

Tuples agrupa valores múltiples en un único valor compuesto. Los valores dentro de una tupla pueden ser de cualquier tipo.

En este caso, las tuplas son "parejas" de 2 valores, uno de tipo String y 1 de tipo Int.


  let res = wordFreqs.filter( { (e) -> Bool in 

Esta parte aplica un filter en la matriz. Puede ver aquí que el cierre del filter toma un elemento e (así, en nuestro caso, una tupla), y devuelve un Bool. Con la function 'filter', devolver true significa save el valor, mientras que devolver false significa filtrarlo.


  if e.1 > 3 { return true } else { return false } 

La syntax e.1 devuelve el valor de la tupla en el índice 1. Entonces, si el valor de la tupla en el índice 1 (el segundo) es superior a 3, el filter devuelve verdadero (por lo que se mantendrá la tupla); si no, el filter devuelve falso (y, por lo tanto, excluye la tupla del resultado). En ese punto, el resultado del filter será [("k", 5), ("a", 7)]


  }).map { $0.0 } 

La function de map crea una nueva matriz basada en la matriz de tuplas: para cada elemento de la matriz de input ($ 0), devuelve el valor de la tupla en el índice 0. Entonces, la nueva matriz es ["k", "a"]


  print(res) 

Esto imprime el resultado a la console.


Estas funciones (filter, map, networkingucir, etc.) son muy comunes en la functional programming. A menudo están encadenados usando la syntax de puntos, por ejemplo, [1, 2, 3].filter({ }).map({ }).networkinguce({ })

 // this creates an array of tuples let wordFreqs = [("k", 5), ("a", 7), ("b", 3)] let res = wordFreqs.filter { (e) -> Bool in // this filters the array // it removes any items that have the second part of the tuple // of 3 or less if e.1 > 3 { return true } else { return false } }.map { // this "maps" the array and returns the first part of the tuple $0.0 } print(res) 

Tenga en count … si escribiera esto, lo networkinguciría a algo así como …

 let res = wordFreqs.filter { $0.1 > 3 } .map { $0.0 } 

wordFreqs es una matriz de tuple .

Tuplas

Una tupla es un grupo de cero o más valores representados como un valor.

Por ejemplo ("John", "Smith") contiene el nombre y apellido de una persona. Puede acceder a los valores internos utilizando la notación de puntos (.) Seguida del índice del valor:

 var person = ("John", "Smith") var firstName = person.0 // John var lastName = person.1 // Smith 

Ahora en su caso tiene tuple con el tipo (String, Int) y con el filter está comparando el e.1 > 3 (Here e es el valor de la tupla de la iteración de la matriz con el filter ) significa que el second(Int) valor second(Int) es mayor que 3

Ahora, después de eso, usa el map en el resultado del filter y simplemente vuelve a sintonizar la String($0.0) de la tupla.

  //array of tuples let wordFreqs = [("k", 5), ("a", 7), ("b", 3)] let res = wordFreqs.filter( { (e) -> Bool in //Comparing the Second Int value of tuple in filter if e.1 > 3 { return true } else { return false } }) //Mapping the result of filter .map { //return the String from the tuple $0.0 } 

Su object e que representa (String, int) escribe. Como puede ver en la matriz dentro de [("k", 5), ("a", 7), ("b", 3)] .

En primer lugar, está utilizando el método de filter , por lo que debe devolver valores true o false . En este caso, verifica si e.1 (significa valor int) es mayor que 3, si no devuelve falso. Después de todo ese process, el método de filter devuelve la matriz filtrada de objects (String, int).

El siguiente paso es la function de map . En tu caso, es simple, simplemente correlaciona todos los valores de la matriz con el primer object de tu tupla (String, int).

Para entender mejor su código podría verse así:

 let filtenetworkingArray = wordFreqs.filter ({ (e) -> Bool in return e.1 > 3 })// the filtenetworkingArray is [("k", 5), ("a", 7)] let finalValue = filtenetworkingArray.map { $0.0 }// here you're creating a new array with String. $0 represents object from filtenetworkingArray print(finalValue) // ["k", "a"]