UPGRADE YOUR SKILLS: Learn advanced Swift and SwiftUI on Hacking with Swift+! >>

Boucles

Les ordinateurs sont parfaits pour effectuer des tâches ennuyeuses des milliards de fois pendant le temps qu'il vous aura fallu pour lire cette phrase. Quand il s'agit de répéter des tâches dans du code, vous pouvez copier et coller votre code plusieurs fois, ou vous pouvez utiliser les boucles - des constructions de programmation simples qui répètent un bloc de code aussi longtemps qu'une condition est vraie.

Pour illustrer cela, je veux vous présenter une fonction spéciale de débogage appelée print(): vous lui donnez du texte à afficher, et elle l’affichera. Si vous exécutez votre code dans un playground comme c'est le cas en ce moment, votre texte apparaîtra dans la fenêtre des résultats. Si vous exécutez une application réelle dans Xcode, vous verrez votre texte apparaître dans le volet contenant les logs de Xcode. Dans tous les cas, print() est un excellent moyen d’avoir un aperçu du contenu d’une variable.

Jetez un oeil à ce code :

print("1 x 10 is \(1 * 10)")
print("2 x 10 is \(2 * 10)")
print("3 x 10 is \(3 * 10)")
print("4 x 10 is \(4 * 10)")
print("5 x 10 is \(5 * 10)")
print("6 x 10 is \(6 * 10)")
print("7 x 10 is \(7 * 10)")
print("8 x 10 is \(8 * 10)")
print("9 x 10 is \(9 * 10)")
print("10 x 10 is \(10 * 10)")

Quand il aura fini de s'exécuter, vous aurez la table de 10 dans le volet des résultats de votre playground. Mais ce code n'est pas efficace, et en fait, une méthode beaucoup plus simple consiste à effectuer une boucle sur un interval de nombres en utilisant ce qu'on appelle l'opérateur d'intervalle fermé (closed range), représenté par trois "." consécutifs : "..."

En utilisant cet opérateur, nous pourrions réécrire tout cela en trois lignes :

for i in 1...10 {
    print("\(i) x 10 is \(i * 10)")
}

Le volet des résultats indique simplement "(10 times)" pour notre boucle, ce qui signifie qu'elle a été exécutée 10 fois. Si vous voulez savoir ce que la boucle a réellement fait, cliquez sur le carré immédiatement à droite de "(10 times)". Vous verrez une boîte affichant "10 x 10 is 100" apparaître dans votre code, et si vous cliquez dessus avec le bouton droit de la souris, l'option "Value History" (historique des valeurs) devrait s'afficher. Cliquez dessus et vous devriez voir un résultat identique à celui de l'image ci-dessous :

Lorsque le playground parcourt une boucle, il indique uniquement le nombre de fois où cette boucle a été exécutée. Si vous souhaitez examiner les valeurs de plus près, cliquez sur le carré dans la zone des résultats.

La boucle compte de 1 à 10 (1 et 10 compris), attribue ce nombre à la constante i, puis exécute le bloc de code à l'intérieur des accolades.

Si vous n'avez pas besoin de savoir à quel numéro vous êtes, vous pouvez utiliser un trait de soulignement (underscore). Par exemple, nous pourrions imprimer des paroles de Taylor Swift comme ceci :

var str = "Fakers gonna"

for _ in 1 ... 5 {
    str += " fake"
}

print(str)

Cela affichera "Fakers gonna fake fake fake fake fake" en ajoutant " fake" à la chaîne à chaque fois que la boucle est exécutée.

Si Swift n’a pas besoin d’attribuer le numéro en cours à une variable à chaque itération de la boucle, le code peut être exécuté un peu plus rapidement. Par conséquent, si vous écrivez for i in…, n'utilisez pas i, Xcode vous suggérera de le remplacer par _.

Il existe une variante à l'opérateur d'intervalle fermé appelé opérateur d'intervalle à moitié ouvert (half open range), et il est facile de les confondre : il ressemble à ..< et compte d'un nombre jusqu'à un autre non compris. Par exemple, 1 ..< 5 comptera 1, 2, 3, 4.

Boucle sur les tableaux

Swift fournit un moyen très simple de parcourir tous les éléments d'un tableau. Dans la mesure où Swift sait déjà quel type de données votre tableau contient, il passe en revue chaque élément du tableau, l'assigne à une constante que vous nommez, puis exécute votre bloc de code. Par exemple, nous pourrions imprimer une liste de chansons géniales comme celle-ci :

var songs = ["Shake it Off", "You Belong with Me", "Look What You Made Me Do"]

for song in songs {
    print("My favorite song is \(song)")
}

Vous pouvez également utiliser la construction de boucle for i in pour parcourir des tableaux, car vous pouvez utiliser cette constante pour obtenir un élement d'un tableau à partir de son indice. Nous pourrions même l'utiliser pour obtenir les élements de deux tableaux à partir de leur indice, comme ceci :

var people = ["players", "haters", "heart-breakers", "fakers"]
var actions = ["play", "hate", "break", "fake"]

for i in 0 ... 3 {
    print("\(people[i]) gonna \(actions[i])")
}

Vous vous demandez peut-être à quoi sert l'opérateur d'intervalle à moitié ouvert (half open range), mais c'est particulièrement utile pour travailler avec des tableaux. Ainsi, plutôt que de compter de 0 à 3 inclus, nous pourrions compter de 0 à le nombre d'éléments présents dans le tableau exclu.

Rappel : on commence à compter à partir de zéro, donc si un tableau contient 4 éléments, l'indice maximum est 3, c'est pourquoi nous ne devons pas inclure le nombre total d'éléments contenus dans le tableau pour la boucle.

Pour compter le nombre d'éléments contenus dans un tableau, on utilise someArray.count. Donc, nous pourrions réécrire notre code comme ceci :

var people = ["players", "haters", "heart-breakers", "fakers"]
var actions = ["play", "hate", "break", "fake"]

for i in 0 ..< people.count {
    print("\(people[i]) gonna \(actions[i])")
}

Boucles imbriquées

Vous pouvez insérer des boucles dans d'autres boucles si vous le souhaitez, et même des boucles dans des boucles à l'intérieur d'autres boucles - et vous pourriez soudainement découvrir que vous faites quelque chose 10 millions de fois, alors faites attention !

Nous pouvons combiner deux de nos boucles précédentes pour créer ceci :

var people = ["players", "haters", "heart-breakers", "fakers"]
var actions = ["play", "hate", "break", "fake"]

for i in 0 ..< people.count {
    var str = "\(people[i]) gonna"

    for _ in 1 ... 5 {
        str += " \(actions[i])"
    }

    print(str)
}

Cela produit "players gonna play play play play play", puis "haters gonna…" Eh bien, vous voyez l'idée.

Une remarque importante : bien que les programmeurs utilisent traditionnellement les constantes i, j et même k pour les boucles, vous pouvez les nommer comme vous le souhaitez : for personNumber in 0 ..< people.count est parfaitement valide.

Boucles While

Vous allez voir un troisième type de boucle, qui répète un bloc de code jusqu'à ce que vous lui disiez de s'arrêter. On utilise ce type de boucle dans les jeux où vous ne savez pas à l'avance combien de temps le jeu va durer - vous continuez simplement à répéter "vérifie si le joueur touche l'écran, anime des robots, dessine à l'écran, vérifie si le joueur touche l'écran, etc." jusqu'à ce que l'utilisateur appuie sur un bouton pour quitter le jeu et revenir au menu principal.

Ces boucles s'appellent les boucles while et ressemblent à ceci :

var counter = 0

while true {
    print("Counter is now \(counter)")
    counter += 1

    if counter == 556 {
        break
    }
}

Ce code introduit un nouveau mot-clé, appelé break. Il est utilisé pour quitter une boucle while ou for à un moment que vous avez décidé. Sans cela, le code ci-dessus ne finirait jamais, car la condition à vérifier est "true", et true est toujours vrai. Sans cette instruction break, la boucle est une boucle infinie, ce qui est une mauvaise chose.

Ces boucles while fonctionnent mieux lorsque vous utilisez des données inconnues, telles que le téléchargement d’éléments sur Internet, la lecture d’un fichier XML par exemple, la consultation de la saisie de l’utilisateur, etc. En effet, vous savez seulement quand arrêter la boucle après l'avoir exécutée un nombre suffisant de fois.

Il existe une contrepartie à break appelée continue. Tandis qu'avec break l'exécution de la boucle est immédiatement interrompue et le code qui suit est exécuté, continue ne fait qu'interrompre l'itération actuelle de la boucle, revient en haut de la boucle et reprend à partir de là.

A titre d'exemple, considérons le code ci-dessous :

var songs = ["Shake it Off", "You Belong with Me", "Look What You Made Me Do"]

for song in songs {
    if song == "You Belong with Me" {
        continue
    }

    print("My favorite song is \(song)")
}

La boucle parcourt le tableau contenant les noms de trois chansons de Taylor Swift, mais n’en n'affichera que deux. La raison à cela est le mot-clé continue : lorsque la boucle essaie d'utiliser la chanson "You Belong with Me", continue est appelé, ce qui signifie que la boucle revient immédiatement au début - l'appel à print() n’est jamais fait et la boucle continue avec "Look What You Made Me Do".

TAKE YOUR SKILLS TO THE NEXT LEVEL If you like Hacking with Swift, you'll love Hacking with Swift+ – it's my premium service where you can learn advanced Swift and SwiftUI, functional programming, algorithms, and more. Plus it comes with stacks of benefits, including monthly live streams, downloadable projects, a 20% discount on all books, and free gifts!

Find out more

Sponsor Hacking with Swift and reach the world's largest Swift community!

BUY OUR BOOKS
Buy Pro Swift Buy Pro SwiftUI Buy Swift Design Patterns Buy Testing Swift Buy Hacking with iOS Buy Swift Coding Challenges Buy Swift on Sundays Volume One Buy Server-Side Swift Buy Advanced iOS Volume One Buy Advanced iOS Volume Two Buy Advanced iOS Volume Three Buy Hacking with watchOS Buy Hacking with tvOS Buy Hacking with macOS Buy Dive Into SpriteKit Buy Swift in Sixty Seconds Buy Objective-C for Swift Developers Buy Beyond Code

Was this page useful? Let us know!

 
Unknown user

You are not logged in

Log in or create account
 

Link copied to your pasteboard.