web-dev-qa-db-fra.com

Filtre de tableau dans Swift3

J'ai un morceau de code. Je ne comprends pas ce qui se passe à l'intérieur de ce code. Quelqu'un peut-il l'expliquer?

 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)

Donne la sortie: 

["k","a"]
4
Amanpreet

Si nous prenons les parties de ce code les unes après les autres:

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

Vous commencez avec un tableau de tuples .

De la documentation Swift:

Un type de tuple est une liste de types séparés par des virgules, entre parenthèses.

et:

Les tuples regroupent plusieurs valeurs en une seule valeur composée. Les valeurs dans un tuple peuvent être de n'importe quel type.

Dans ce cas, les tuples sont des "couples" de 2 valeurs, une de type String et 1 de type Int.


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

Cette partie applique un filtre sur le tableau. Vous pouvez voir ici que la fermeture du filtre prend un élément e (donc, dans notre cas, un tuple) et renvoie un booléen. Avec la fonction 'filter', renvoyer true signifie conserver la valeur, tandis que renvoyer false signifie la filtrer.


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

La syntaxe e.1 renvoie la valeur du tuple à l'index 1 . Ainsi, si la valeur du tuple à l'index 1 (la seconde) est supérieure à 3, le filtre renvoie la valeur true (le tuple sera donc conservé); sinon, le filtre retourne false (et donc exclut le nuplet du résultat) . À ce stade, le résultat du filtre sera [("k", 5), ("a", 7)]


        }).map { $0.0 }

La fonction map crée un nouveau tableau basé sur le tableau Tuple: pour chaque élément du tableau en entrée ($ 0), elle renvoie la valeur Tuple à l'index 0. Le nouveau tableau est donc ["k", "a"]


        print(res)

Cela affiche le résultat sur la console.


Ces fonctions (filtrer, mapper, réduire, etc.) sont très courantes dans la programmation fonctionnelle. Ils sont souvent chaînés à l'aide de la syntaxe à points, par exemple, [1, 2, 3].filter({ }).map({ }).reduce({ })

11
Frédéric Adda
// 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)

Remarque ... si j'écrivais ceci, je le réduirais à quelque chose comme ...

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

wordFreqs est un tableau de Tuple.

Tuples

Un tuple est un groupe de zéro ou plusieurs valeurs représentées par une valeur.

Par exemple ("John", "Smith") contient le prénom et le nom d'une personne. Vous pouvez accéder aux valeurs internes en utilisant la notation point (.) Suivie de l'index de la valeur:

var person = ("John", "Smith")

var firstName = person.0 // John
var lastName = person.1 // Smith

Maintenant, dans votre cas, vous avez Tuple de type (String, Int) et avec filter, vous comparez le e.1 > 3 (e is contient la valeur Tuple de l'itération du tableau avec filter) signifie que la valeur second(Int) est supérieure à 3.

Après cela, utilisez map sur le résultat filter et réaccordez simplement String($0.0) à partir du tuple.

    //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 
    }
1
Nirav D

Votre objet e représentant le type (String, int). Comme vous pouvez le voir dans un tableau à l'intérieur de [("k", 5), ("a", 7), ("b", 3)].

Tout d’abord, vous utilisez la méthode filter, c’est pourquoi vous devez renvoyer les valeurs true ou false. Dans ce cas, vous vérifiez si e.1 (signifie int valeur) est supérieur à 3, sinon vous renvoyez false. Après tout ce processus, la méthode filter renvoie un tableau filtré d'objets (String, int).

La prochaine étape est la fonction map. Dans votre cas, c'est simple, il vous suffit de mapper toutes les valeurs d'un tableau sur le premier objet de votre tuple (String, int).

Pour mieux comprendre votre code pourrait ressembler à ceci:

let filteredArray = wordFreqs.filter
({
    (e) -> Bool in
    return e.1 > 3
})// the filteredArray is [("k", 5), ("a", 7)]


let finalValue = filteredArray.map { 
  $0.0
}// here you're creating a new array with String. $0 represents object from filteredArray

print(finalValue) // ["k", "a"]
1
kamwysoc