Accès sécurisé aux tableaux en Swift : comment oublier l'index out of range

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : Pourquoi votre code peut planter à tout moment ?

\n

Chaque développeur Swift a déjà rencontré cette erreur fantôme : Fatal error: Index out of range. Elle apparaît soudainement, fait planter l'application, et l'utilisateur ne voit qu'un écran blanc. Rien de plus simple en apparence que de prendre un élément d'un tableau par son index ? Mais dans les projets réels — surtout lorsqu'on travaille avec des données réseau, l'analyse JSON ou la saisie utilisateur — l'index peut facilement sortir des limites.

\n

Dans cet article, nous allons voir comment oublier définitivement le problème index out of range et rendre votre code non seulement sûr, mais aussi élégant. Nous parlerons de safe array lookup en Swift, utiliserons les optional bindings (if let et guard let), apprendrons à écrire nos propres extensions et verrons comment les professionnels font en production.

\n\n

Le problème : L'accès standard au tableau — une roulette russe

\n

Regardons une situation typique. Vous avez un tableau de chaînes :

\n
let fruits = ["Pomme", "Banane", "Orange"]\nlet index = 3\nprint(fruits[index]) // 💥 Fatal error: Index out of range
\n

Le code plante instantanément. Swift est un langage à typage sûr, mais le subscript standard ([]) ne vérifie pas les limites. Il prend simplement l'élément à l'adresse mémoire, et si l'index est incorrect — l'application plante. C'est un héritage de C et Objective-C dont nous voulons nous débarrasser.

\n\n

Solution n°1 : Optional Binding (if let) — premier pas vers la sécurité

\n

La méthode la plus évidente est de vérifier l'index manuellement avant d'y accéder. Mais Swift propose une approche plus idiomatique : utiliser optional binding avec une vérification de plage.

\n

Voici à quoi cela ressemble :

\n
let fruits = ["Pomme", "Banane", "Orange"]\nlet index = 2\n\nif index < fruits.count {\n    let fruit = fruits[index]\n    print("Nous avons obtenu : \\(fruit)")\n} else {\n    print("L'index \\(index) est hors limites")\n}
\n

Cela fonctionne, mais semble lourd. Et si nous voulions le faire en une seule ligne et obtenir une valeur optionnelle ? C'est là que guard vient à la rescousse :

\n
func fruitSecurisee(at index: Int) -> String? {\n    guard index >= 0, index < fruits.count else { return nil }\n    return fruits[index]\n}\n\nif let fruit = fruitSecurisee(at: 3) {\n    print("Youpi, nous avons obtenu un fruit : \\(fruit)")\n} else {\n    print("Il n'y a pas de fruit à cet index")\n}
\n

C'est déjà mieux ! La fonction retourne un Optional<String>, et nous traitons nil sereinement. Plus de crash. Mais écrire une telle fonction pour chaque tableau n'est pas très agréable.

\n\n

Solution n°2 : Extension — la magie des protocoles

\n

La vraie force de Swift réside dans les extensions. Nous pouvons ajouter un subscript sécurisé à n'importe quel tableau une fois pour toutes et l'utiliser partout. Voici comment faire :

\n
extension Collection {\n    /// Retourne en toute sécurité l'élément à l'index, s'il existe.\n    /// - Parameter index: L'index de l'élément.\n    /// - Returns: L'élément optionnel.\n    subscript(safe index: Index) -> Element? {\n        return indices.contains(index) ? self[index] : nil\n    }\n}
\n

Maintenant, nous pouvons écrire :

\n
let nombres = [10, 20, 30, 40, 50]\n\nif let premier = nombres[safe: 0] {\n    print("Premier élément : \\(premier)") // 10\n}\n\nif let dernier = nombres[safe: 4] {\n    print("Dernier élément : \\(dernier)") // 50\n}\n\nif let inexistant = nombres[safe: 10] {\n    print("Ceci ne s'affichera jamais")\n} else {\n    print("L'élément à l'index 10 n'existe pas")\n}
\n

Remarquez : nous avons étendu le protocole Collection, et non le type spécifique Array. Cela signifie que notre subscript sécurisé fonctionne pour toutes les collections : tableaux, chaînes, DictionaryKeys, Set et même les types personnalisés conformes à Collection.

\n\n

Pourquoi cela fonctionne-t-il ?

\n
    \n

Blogs

Book Recommendations