Nouvelle formule ! Formation Swift · SwiftUI · UIKit

Clean
Architecture iOS.

Votre code iOS lave plus blanc.

Séparez le métier de l’interface. Écrivez des tests qui tournent vite. Faites évoluer votre app sans tout réécrire.

Sans singletons ajoutés. Efficace même sur les vieux ViewControllers.

« J’ai dit à ma Tech Lead que j’avais rangé le code. Elle a cru j’étais malade. Nan meuf, je me forme. »

Julie
La méthode, en pratiqueSwift · SwiftUI · UIKit
Un développeur en sweat bleu code sur son ordinateur, avec un écran rétro à ses côtés
Du vrai code.Sur de vrais projets.

08 modules progressifs

36 chapitres

31 h de pratique en vidéo

01 app fil rouge

Une développeuse examine du code sur deux écrans à son bureau
Votre dossier ViewControllers/, en ce moment.

01 / Le constat

Les taches tenaces
ont trouvé leur maître.

Un HomeViewController de 3 812 lignes. Des appels URLSession au milieu d'un viewDidLoad. Un Manager partagé que personne n'ose ouvrir. Des tests qui prennent 11 minutes, quand ils compilent.

Ce n'est pas de votre faute. C'est le Massive View Controller, la tache la plus répandue de l'écosystème Apple. On apprend à le démêler, une responsabilité à la fois.

La solution existe. Et elle tient en 4 couches !

  • Chaque nouvelle feature casse deux écrans
  • Impossible de tester sans lancer le simulateur
  • Passer de UIKit à SwiftUI ressemble à un déménagement
  • Le nouveau dev met trois semaines à comprendre où ranger son code

« Mon Manager il faisait tellement de trucs, il lui manquait juste un permis poids lourd. Là je l’ai viré, ce bordel. »

Maxime

02 / Avant — après

Le test avant / après.
Ça change tout !

Faites glisser la poignée pour comparer un ViewController qui fait tout et des responsabilités bien séparées.

Après : 4 fichiers, 0 tache
// Domain/Entities/Article.swift
struct Article: Identifiable, Equatable {
    let id: UUID
    let title: String
    let isFavorite: Bool
}

// Domain/UseCases/LoadArticles.swift
protocol ArticleRepository {
    func fetchAll() async throws -> [Article]
}

struct LoadArticles {
    let repository: ArticleRepository

    func callAsFunction() async throws -> [Article] {
        try await repository.fetchAll()
            .sorted { $0.isFavorite && !$1.isFavorite }
    }
}
// Presentation/ArticlesViewModel.swift
@Observable final class ArticlesViewModel {
    private(set) var articles: [Article] = []
    private let loadArticles: LoadArticles

    init(loadArticles: LoadArticles) { ... }

    func onAppear() async {
        articles = (try? await loadArticles()) ?? []
    }
}

// Tests : 0,3 s. Sans simulateur. Sans réseau.
Avant : HomeViewController.swift, ligne 1 204 sur 3 812
class HomeViewController: UIViewController, UITableViewDelegate,
    UITableViewDataSource, CLLocationManagerDelegate, WKNavigationDelegate {

    var articles = [[String: Any]]()
    var isLoading = false // TODO: remove ??
    var tmp2: Any?

    override func viewDidLoad() {
        super.viewDidLoad()
        AppManager.shared.user!.token!
        let url = URL(string: "https://api.prod.com/v2/articles?u="
            + UserDefaults.standard.string(forKey: "uid")!)!
        URLSession.shared.dataTask(with: url) { data, _, _ in
            let json = try! JSONSerialization.jsonObject(with: data!)
            self.articles = json as! [[String: Any]]
            self.articles.sort { ($0["fav"] as? Bool ?? false) }
            CoreDataStack.shared.save(self.articles) // crash parfois ?
            DispatchQueue.main.async {
                self.tableView.reloadData()
                if self.articles.count > 0 {
                    self.emptyView.isHidden = true
                    Analytics.track("loaded", self.articles.count)
                    NotificationCenter.default.post(name: .init("REFRESH_ALL"), object: nil)
                }
            }
        }.resume()
        // NE PAS TOUCHER (Kevin, 2019)
        self.setupLocationMaybe()
        self.setupWebViewForPromoBanner()
    }
    ...

03 / La méthode

Quatre couches.
Une règle simple.

Chaque couche a un seul travail, et les dépendances ne pointent que vers l'intérieur. Votre logique métier ne sait même pas que UIKit existe. Elle survivra à SwiftUI 7, à la prochaine refonte du design, et au départ de Kevin.

Entities
Vos règles métier en struct pures. Zéro import.
Use Cases
Ce que fait l'app, une action par type. Testable en isolation.
Interface Adapters
ViewModels, Presenters, Repositories. Le traducteur.
Frameworks
SwiftUI, UIKit, Core Data, URLSession. Interchangeables.

« UIKit connaît mon domaine. Mon domaine connaît pas UIKit. C’est une relation à sens unique, comme mon ex. Sauf que là ça marche. »

Inès

Le L de SOLID · La règle qui tient parole

Liskov.On change le flacon.
Pas la promesse.

Le principe de substitution de Liskov, c’est pouvoir remplacer un type par un sous-type sans casser le comportement attendu par le code qui l’utilise. Même contrat, mêmes garanties : on ne rajoute pas des conditions en douce et on ne retire pas ce qui était promis.

En Swift, gardez cette exigence derrière vos protocoles. Si ArticleRepository.fetchAll() promet de renvoyer tous les articles, une implémentation qui ne renvoie que les favoris ne respecte pas le contrat. Réseau, stockage local ou doublure de test : le Use Case doit pouvoir leur faire confiance.

Un protocole qui compile, c’est bien. Une implémentation qui tient parole, c’est propre.

04 / Un aperçu

Les principes,
avant la pratique.

Découvrez les fondations de la Clean Architecture avec Robert C. Martin. Choisissez un chapitre pour aller à l’essentiel.

Chapitres de l'extrait

Extrait : « The Principles of Clean Architecture », Robert C. Martin, NorfolkDevelopers.

05 / Le programme

8 cycles pour un code
impeccable.

Huit modules pour construire une app de A à Z. Du Swift concret, des exercices et les compromis qu’on rencontre en production.

  1. Prélavage : diagnostiquer la tache

    Repérer le Massive View Controller, mesurer le couplage, cartographier les dépendances de votre app actuelle.

    2 h 40
    4 chapitres
    1. Anatomie d'un Massive View Controller18 min
    2. Mesurer le couplage avec un graphe de dépendances24 min
    3. Les 5 odeurs qui ne trompent pas31 min
    4. Atelier : auditer l'app fil rouge1 h 07
  2. Entities et Use Cases

    Modéliser le métier en Swift pur. Value types, erreurs typées, async/await sans fuite d'abstraction.

    4 h 10
    5 chapitres
    1. Value types et invariants métier42 min
    2. Erreurs typées avec throws(DomainError)35 min
    3. Un Use Case, une intention48 min
    4. async/await et concurrence stricte Swift 61 h 05
    5. Atelier : le domaine de l'app fil rouge1 h
  3. Repositories et protocoles

    Isoler le réseau et la persistance. URLSession, SwiftData, Core Data derrière la même interface.

    3 h 55
    4 chapitres
    1. Le principe d'inversion des dépendances29 min
    2. Un client HTTP testable en 80 lignes51 min
    3. SwiftData et Core Data derrière un protocole58 min
    4. Cache, offline et stratégies de synchronisation1 h 37
  4. Présentation : SwiftUI et UIKit

    ViewModels @Observable, Presenters UIKit, coordinateurs de navigation. Le même domaine, deux interfaces.

    5 h 20
    5 chapitres
    1. ViewModels @Observable et états d'écran1 h 02
    2. Presenters et ViewControllers enfin minces54 min
    3. Navigation : coordinators et NavigationStack1 h 11
    4. Faire cohabiter UIKit et SwiftUI48 min
    5. Atelier : un écran, deux interfaces1 h 25
  5. Injection de dépendances, sans framework magique

    Composition root, factories, environnement SwiftUI. Vous saurez exactement qui crée quoi.

    3 h 05
    4 chapitres
    1. La composition root, là où tout s'assemble38 min
    2. Factories et conteneurs faits maison46 min
    3. @Environment pour les dépendances SwiftUI41 min
    4. Configurations debug, staging et production1 h
  6. Tests : le cycle rinçage

    Tests unitaires en millisecondes, test doubles écrits à la main, Swift Testing, snapshot tests ciblés.

    4 h 30
    5 chapitres
    1. Swift Testing : @Test, #expect et paramètres47 min
    2. Stubs, spies et fakes écrits à la main58 min
    3. Tester l'asynchrone sans sleep52 min
    4. Snapshot tests là où ils servent vraiment39 min
    5. Atelier : 100 % du domaine couvert1 h 14
  7. Modularisation avec Swift Package Manager

    Découper l'app en packages locaux, réduire les temps de build, garder des frontières qui tiennent.

    3 h 45
    4 chapitres
    1. Packages locaux et graphe de modules44 min
    2. Feature modules et interfaces publiques57 min
    3. Réduire les temps de build de moitié49 min
    4. Previews SwiftUI isolées par module1 h 15
  8. Essorage : migrer une app existante

    La stratégie strangler fig appliquée à une vraie app de 80 000 lignes, écran par écran, sans geler les releases.

    3 h 35
    5 chapitres
    1. La stratégie strangler fig33 min
    2. Choisir le premier écran à migrer27 min
    3. Extraire le domaine d'un ViewController existant1 h 21
    4. Feature flags et migration progressive46 min
    5. Retour d'expérience : 18 mois de migration48 min

« J’ai lancé le module 1 pour voir. Trois heures après j’étais en train de refactorer mon app en slip. J’ai même pas fini mes pâtes. »

Romain

Ce qui change au quotidien

Moins de magie.
Plus de maîtrise.

01 / Comprendre

Savoir où va le code.

Une règle métier dans le domaine. Un appel réseau dans un adapter. Chaque responsabilité a une adresse.

02 / Tester

Vérifier sans attendre.

Des Use Cases testables sans réseau et sans simulateur. Un retour rapide à chaque changement.

03 / Faire évoluer

Changer une pièce.

Passer de UIKit à SwiftUI ou remplacer la persistance sans emporter tout le métier avec.

Ils ont testé la formule

Ils en parlent mieux
que nous, wesh.

Du code propre. Des retours qui le sont un peu moins.

KarimDéveloppeur iOS senior · Lyon

« Wesh, j’avais un ViewController de 4 000 lignes, frère. Là j’ai des Use Cases partout et mes tests ils tournent en 0,4 seconde. C’est carré de ouf. »

« Ma Tech Lead elle m’a fait : t’as changé de lessive ou quoi ? J’ai dit nan, j’ai juste arrêté les singletons. Tranquille. »

JulieDéveloppeuse iOS · Nantes

« Avant je mettais des force unwrap comme un ouf. Maintenant c’est guard let ou rien. Respect l’oncle Bob, sur la vie. »

YanisFreelance iOS · Marseille

« 19 999,99 balles la journée, j’ai dit c’est chaud. Et puis j’ai vu toute la CI passer au vert. Franchement, ça les vaut, wallah. »

SophieEngineering Manager · Bordeaux

« Mon AppManager.shared gérait le réseau, le cache et probablement mon divorce. J’ai découpé ce bordel. Maintenant chaque classe fait un truc. UN. Putain le concept. »

MaximeDéveloppeur iOS · Lille

« Mes tests ils tapaient la prod, frère. LA PROD. C’était pas une suite de tests, c’était une prise d’otage du backend. Maintenant j’ai des mocks. Le serveur me dit merci, ce bâtard. »

LéaDéveloppeuse iOS · Toulouse

« Je pushais le vendredi à 18 h et je coupais Slack comme un gros lâche. Maintenant la CI est verte et je pars normal. C’est plus une release, c’est une putain de thalasso. »

RomainLead iOS · Rennes

« Le backend a changé son JSON, j’ai dit ça y est on est baisés. Bah non. Un adapter à modifier. UN FICHIER. J’ai fini avant que mon café il refroidisse, jpp. »

InèsFreelance iOS · Montpellier

« J’avais appelé ma classe CleanViewModel. Elle faisait 2 800 lignes. Frérot c’était juste de la merde avec du parfum. Là j’ai compris les responsabilités. Ça pique mais ça lave. »

AlexDéveloppeur SwiftUI · Strasbourg

« Le nouveau dev il m’a demandé où mettre son code. J’ai répondu en une phrase. Avant fallait deux réunions et un exorciste pour comprendre cette connerie. Là c’est rangé, ferme le ticket. »

ChloéTech Lead iOS · Paris

06 / Les formules

À chaque projet
son format de lessive.

Un premier écran à remettre en ordre, une app entière à repenser ou une équipe à accompagner.

Le Flacon Découverte

Pour tester la formule sur un premier écran.

249 € 149 €

Épuisé

  • Modules 1 à 4
  • Code source de l'app fil rouge
  • Accès à vie, mises à jour Swift incluses
  • Compatible CPF

La formule complète

Le Baril Familial

La formation complète, pour un code propre de la cave au grenier.

790 € 490 €

Épuisé

  • Les 8 modules, 31 heures de vidéo
  • Exercices corrigés et revue de code de votre projet
  • Communauté privée et 6 lives de questions par an
  • Certificat « Développeur Clean Archi »

Compatible CPF. Paiement en 3 fois sans frais.

Le Grand Pressing

Une journée d'atelier intensif avec toute votre équipe iOS, chez vous ou à distance.

14 000 €19 999,99 € la journée

  • 1 journée d'atelier sur votre propre codebase
  • Audit d'architecture et plan de migration écrit
  • Jusqu'à 40 développeurs, café compris
  • Compatible CPF et OPCO
Réserver la journée

« 19 999,99 balles. Le centime de moins m’a convaincue, frère. J’ai dit à la compta qu’on faisait des économies. »

Sophie

Mais attendez, ce n’est pas tout !

Inclus avec la formation complète, pour passer de la vidéo à votre projet :

  • Le template Xcode Clean Archi pour démarrer chaque nouveau projet déjà rangé (valeur 79 €)
  • Le poster des dépendances pour garder la règle sous les yeux (valeur 29 €)
  • La checklist de code review en 42 points, version PDF et Notion (valeur 49 €)

Satisfait ou remboursé.
Promis, juré.

Suivez les modules, appliquez la méthode à un écran de votre app. Si votre code n'est pas plus propre dans les 30 jours, écrivez-nous : on vous rembourse intégralement, sans questions.

Et on vous rend votre ViewController de 3 812 lignes. Promis.

« J’avais 30 jours pour me faire rembourser. Au jour 2 mes tests passaient. Putain, même pas moyen de râler. »

Chloé
Note de terrain / 001

Une bonne architecture se reconnaît au code qu’on peut changer sans avoir peur.

Le principe derrière chaque module.

Apprendre avec
la réalité du terrain.

Douze ans d'apps en production sur l'App Store, de la startup à la banque, de l'Objective-C à Swift 6. Chaque module vient d'une vraie migration, avec ses impasses, ses compromis et ses releases du vendredi.

Des exemples qui expliquent aussi les choix, les limites et les compromis.

Les questions
du lavomatic.

C'est adapté si je fais seulement du SwiftUI ?

Oui. La formation montre chaque concept en SwiftUI et en UIKit. Si vous ne faites que du SwiftUI, sautez les passages UIKit, ils sont clairement marqués.

Quel niveau faut-il pour suivre ?

Avoir publié ou contribué à au moins une app iOS et être à l'aise avec Swift. Pas besoin de connaître la Clean Architecture, ni les design patterns par cœur.

VIPER, MVVM, TCA… c'est la même chose ?

Non. Ce sont des façons d'organiser la présentation. La Clean Architecture s'occupe de l'ensemble de l'app et s'entend très bien avec MVVM. Un module compare honnêtement les approches, TCA compris.

Je peux l'appliquer à une app existante ?

C'est même le sujet du dernier module. On migre écran par écran, sans réécriture complète et sans geler les releases.

Comment fonctionne le remboursement ?

Un e-mail dans les 30 jours suivant l'achat suffit. Le remboursement arrive sous 5 jours ouvrés, sur le moyen de paiement utilisé.

Ça marche aussi sur le linge ?

Non. Nous déclinons toute responsabilité en cas de pull rétréci.

Votre prochain git push
mérite de sentir bon.

Clean Architecture iOS : la bonne formule pour vos prochaines apps.

Trouver ma formation

Compatible CPF. Satisfait ou remboursé pendant 30 jours. Accès immédiat.