Aujourd’hui nous allons examiner un type fondamental de Swift : le tuple. Mais qu’est ce que cette chose ? Pour faire simple un tuple c’est un ensemble / une composition de plusieurs éléments. J’insiste sur le fait qu’il y a plusieurs éléments dans un tuple car Swift n’autorise pas moins de 2 éléments dans un tuple, mais nous y reviendrons dans quelques instants. Pour illustrer rapidement la chose, un tuple de 2 éléments s’appelle une paire dont voici un example : (1, « un »). Ici nous avons une paire avec un entier comme premier élément et une chaine de caractère en deuxième. Maintenant voyons un peu comment cela fonctionne et aussi à quoi cela peut bien servir ?
Les tuples anonymes
Tout d’abord commençons par regarder la syntaxe d’un tuple en Swift :
let pair = (1, "un")
let tuple = ("Swift", 11, true)
Ici nous avons défini un groupe de deux valeurs, un entier avec une chaine de caractère que nous avons appeler pair ainsi qu’un autre tuple tuple avec une chaine de caractère, un entier et un booléen. Ces tuples ne sont pas nommés (anonymes), c’est à dire que l’on ne peut accéder à leurs valeurs qu’en utilisant leur position dans le tuple :
let tuple = ("Swift", 11, true)
let e1 = tuple.0
let e2 = tuple.1
let e3 = tuple.2
Sinon on peut aussi utiliser une facilité syntaxique : la décomposition.
let (nom, age, vivant) = ("Swift", 11, true)
print(nom) // Swift
print(age) // 11
print(vivant) // true
Si vous souhaitez omettre une valeur vous pouvez utiliser le « _ » à la place du nom de la variable.
let (nom, _, _) = ("Swift", 11, true)
print(nom) // Swift
Les tuples nommés
Pour rendre leur manipulation plus simple il est aussi possible de nommé les éléments au sein des tuples. Regardons cela d’un peu plus près :
let tuple = (nom: "Swift", age: 11, vivant: true)
print(tuple.nom) // Swift
print(tuple.age) // 11
print(tuple.vivant) // true
En utilisant la notation par point nous pouvons plus facilement accéder aux éléments du tuple.
Value Type
Une chose importante à noter sur les tuples c’est que ce sont des types valeurs (Value Types). Contrairement aux références (Reference Types) lorsque l’on passe un tuple à une function on ne passe pas leur référence met une copie du tuple. En voici une illustration :
let t1 = (nom: "Swift", age: 11, vivant: true)
var t2 = t1
t2.nom = "Tuto"
print(t1.nom) // Swift
print(t2.nom) // Tuto
Cas d’usage
Les tuples sont vraiment utile lorsque l’on a besoin de retourner plusieurs valeurs en retour d’une méthode ou fonction. Vous pouvez soit retourner des tuples anonymes ou nommés comme bon vous semble :
func meilleurScore() -> (nom: String, score: Int) {
return (nom: "Monica", score: 349)
}
Cette méthode ne prend pas de paramètre et retourne une paire nommée avec un nom et un score. Pour utiliser le résultat rien de plus simple :
let result = meilleurScore()
print("\(result.nom) avec un score de \(result.score)")
Cas particuliers
Comme nous l’avons expliqué en introduction les tuples en Swift doivent comporter au moins 2 éléments. En réalité le type Void n’est rien d’autre qu’un typealias du tuple vide :
public typealias Void = ()
Et un tuple d’un seul élément est équivalent au type de l’élément. Par example (Int) est de type Int et non pas (Int) :
(Int).self == Int.self // true
Pour finir
J’espère que cet article vous aura aider à comprendre un peu mieux le fonctionnement des tuples en Swift. Si vous avez des questions n’hésitez pas à poser vos question ici.