Skip to main content

Alessandros's Blog - Build with freedom. Share with purpose

7 Juillet 2025 - Fonctions avancées en Swift : paramètres par défaut et gestion d’erreurs

Me voilà au huitième jour des 100 Days, et aujourd’hui j’ai plongé dans des concepts plus avancés avec les fonctions : paramètres par défaut, gestion d’erreurs, et un premier checkpoint plus avancé !

# Apprentissages du jour

## Paramètres par défaut : simplifier les appels de fonction

Les paramètres par défaut permettent de créer des fonctions flexibles qui peuvent être appelées de différentes manières selon les besoins.

func printTimesTable(for number: Int, end: Int = 10) {
    for i in 1...end {
        print("\(i) x \(number) is \(i * number)")
    }
}

printTimesTable(for: 2, end: 20)  // Table complète jusqu'à 20
printTimesTable(for: 5)           // Utilise la valeur par défaut (10)

C’est vraiment pratique ! Cela évite de devoir passer des valeurs systématiquement si on sait qu’elles seront dans la plupart des cas utilisées, mieux vaut donc les définir par défaut.

## Gestion d’erreurs : Swift nous force à bien faire

La gestion d’erreurs en Swift suit une approche structurée en 3 étapes obligatoires :

### 1. Définir les erreurs possibles

enum PasswordError: Error {
    case short, obvious
}

Swift oblige à réfléchir en amont à tout ce qui peut mal se passer. C’est contraignant au début, mais ça rend le code beaucoup plus robuste.

### 2. Créer une fonction qui peut lancer des erreurs

func checkPassword(_ password: String) throws -> String {
    if password.count < 5 { throw PasswordError.short }
    if password == "12345" { throw PasswordError.obvious }
    
    if password.count < 8 {
        return "OK"
    } else if password.count < 10 {
        return "Good"
    } else {
        return "Excellent"
    }
}

Le mot-clé throws indique que cette fonction peut lancer des erreurs. C’est marqué clairement dans la signature, impossible de l’oublier !

### 3. Appeler la fonction et gérer les erreurs

do {
    let result = try checkPassword(string)
    print("Password rating: \(result)")
} catch PasswordError.short {
    print("Please use a longer password")
} catch {  // "Pokemon catch" - attrape tout le reste !
    print("There was an error")
}

J’aime bien l’analogie de Paul Hudson avec le “Pokemon catch” pour le catch général qui attrape toutes les erreurs non gérées spécifiquement.

Conseil de Paul Hudson : Quand on apprend, commencer petit avec peu de fonctions qui lancent des erreurs, puis progressivement s’habituer à cette approche.

# Challenge personnel : Checkpoint 4

Le checkpoint 4 était plus complexe que les 3 précédents : créer une fonction qui calcule la racine carrée d’un entier sans utiliser les fonctions intégrées.

## Contraintes du défi

• Accepter un entier de 1 à 10 000 • Calculer la racine carrée sans fonction intégrée • Gérer les cas d’erreur (hors limites, pas de racine entière) • Retourner seulement les racines carrées entières

## Ma solution

enum NumberReceived: Error {
    case noRoot, notIntegerSquare, outOfBoundaries
}

func square(of number: Int) throws -> Int {
    if number < 1 || number > 10_000 {
        throw NumberReceived.outOfBoundaries
    }
    
    var square: Int = 0
    
    for i in 1...100 {
        if i * i == number {
            square = i
        }
    }
    
    if square == 0 {
        throw NumberReceived.noRoot
    }
    return square
}

L’approche la plus pertinente : Tester tous les nombres de 1 à 100 pour voir si leur carré correspond au nombre donné. C’est plus élégant que ma première solution qui passait par des arrays, et parfaitement adapté à la plage demandée !

# Réflexions sur cette journée

Cette session m’a vraiment fait comprendre l’approche “sécurité d’abord” de Swift. La gestion d’erreurs obligatoire peut sembler lourde au début, mais elle me force à anticiper les problèmes plutôt que de les découvrir en production.

# Avancement sur les projets portfolio

## Préparation de l’application Quiz Game

Cet après-midi, j’ai commencé à travailler sur mon deuxième projet portfolio : une application de quiz pour QuickTest Academy. Cette app me semble beaucoup plus simple que l’application de fidélité préparée la semaine passée avec moins de flux utilisateurs et plus directe à développer.

Elle va me permettre d’explorer tout ce qui est gestion d’états et navigation au niveau des interfaces, ce qui complète parfaitement mes apprentissages SwiftUI.

### Ce que j’ai accompli aujourd’hui :

Définition des besoins avec le client fictif • Création des user storiesConception des user flows

Au niveau technologique, ça reste quelque chose d’assez classique. Point d’attention pour les prochaines applications : il faudra augmenter progressivement la complexité pour continuer à apprendre de nouveaux concepts et ne pas stagner sur des développements trop simples.

## Planning pour demain

Demain, je vais commencer le wireframing, et si ça avance vite, je passerai directement au prototypage HD. Ça me permettra d’avancer rapidement sur la préparation.

## Questionnements sur l’architecture

Je reste encore un peu hésitant concernant le setup des environnements Xcode. J’appréhende de perdre beaucoup de temps à ce stade, donc je préfère continuer à suivre les 100 Days au lieu de me lancer dans des expérimentations qui pourraient me faire perdre du temps.

Je réfléchis toujours à l’architecture MVVM versus une approche plus simple comme MVC (Model-View-Controller) pour commencer. MVVM me semble beaucoup plus complexe, peut-être que commencer par MVC serait plus adapté à ma phase d’apprentissage.

## Weekend bien mérité

J’ai passé un excellent weekend ! On a binge-watché Squid Game saison 3 avec ma chérie et on s’est bien reposés après être sortis samedi soir pour l’anniversaire de Laura (rentrés à 2h du matin dimanche !).

Petite frayeur hier : ma petite Tokyo s’est fait piquer par une guêpe à la patte. Au final, plus de peur que de mal, elle n’a eu aucune complication et là elle va mieux; elle gambade, elle saute, elle fait la fofolle !

## Prochaine étape

Demain, on attaque les closures qui je crois est plus spécifique à Swift ! J’ai hâte de découvrir ce nouveau concept dans la suite des 100 Days of SwiftUI.

Après cette journée bien remplie, direction le vélo d’intérieur pour brûler quelques calories !

À demain pour le jour 32 de formation.

Alessandro