Swift Language
Fonctions Swift Advance
Recherche…
Introduction
Fonctions Advance comme map
, flatMap
, filter
et reduce
sont utilisés pour faire fonctionner sur différents types de collections comme matrice et le dictionnaire. Les fonctions avancées nécessitent généralement peu de code et peuvent être enchaînées afin de construire une logique complexe de manière concise.
Introduction aux fonctions avancées
Prenons un scénario pour mieux comprendre la fonction avancée,
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]
Fonction de la carte:
Utilisez map pour effectuer une boucle sur une collection et appliquer la même opération à chaque élément de la collection. La fonction map renvoie un tableau contenant les résultats de l'application d'une fonction de mappage ou de transformation à chaque élément.
//Fetch all the user's name from array
let arrUserName = arrUser.map({ $0.name }) // ["John", "Chan", "Morgan", "Rachel", "Katie", "David", "Bob"]
Fonction Flat-Map:
L'utilisation la plus simple est, comme son nom l'indique, d'aplatir une collection de collections.
// Fetch all user country name & ignore nil value.
let arrCountry = arrUser.flatMap({ $0.country }) // ["USA", "UK", "USA", "USA"]
Fonction de filtre:
Utilisez le filtre pour parcourir une collection et renvoyer un tableau contenant uniquement les éléments correspondant à une condition d'inclusion.
// 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"]
Réduire:
Utilisez réduire pour combiner tous les éléments d'une collection afin de créer une nouvelle valeur unique.
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
Aplatir un tableau multidimensionnel
Pour aplatir un tableau multidimensionnel en une seule dimension, les fonctions avancées de flatMap sont utilisées. Un autre cas d'utilisation est de négliger la valeur nulle des valeurs de tableau et de mappage. Vérifions avec exemple: -
Supposons que nous ayons un tableau multidimensionnel de villes et que nous souhaitons classer la liste des noms de ville par ordre croissant. Dans ce cas, nous pouvons utiliser la fonction flatMap comme: -
let arrStateName = [["Alaska", "Iowa", "Missouri", "New Mexico"], ["New York", "Texas", "Washington", "Maryland"], ["New Jersey", "Virginia", "Florida", "Colorado"]]
Préparer une liste à une seule dimension à partir d'un tableau multidimensionnel,
let arrFlatStateList = arrStateName.flatMap({ $0 }) // ["Alaska", "Iowa", "Missouri", "New Mexico", "New York", "Texas", "Washington", "Maryland", "New Jersey", "Virginia", "Florida", "Colorado"]
Pour trier les valeurs de tableau, nous pouvons utiliser une opération de chaînage ou trier un tableau à plat. Voici l'exemple ci-dessous montrant l'opération de chaînage,
// 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"]