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.
Nouvelle formule ! Formation Swift · SwiftUI · UIKit
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
08 modules progressifs
36 chapitres
31 h de pratique en vidéo
01 app fil rouge
ViewControllers/, en ce moment.01 / Le constat
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 !
« Mon Manager il faisait tellement de trucs, il lui manquait juste un permis poids lourd. Là je l’ai viré, ce bordel. »
Maxime02 / Avant — après
Faites glisser la poignée pour comparer un ViewController qui fait tout et des responsabilités bien séparées.
// 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.
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
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.
struct pures. Zéro import.« 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èsLe L de SOLID · La règle qui tient parole
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
Découvrez les fondations de la Clean Architecture avec Robert C. Martin. Choisissez un chapitre pour aller à l’essentiel.
Extrait : « The Principles of Clean Architecture », Robert C. Martin, NorfolkDevelopers.
05 / Le programme
Huit modules pour construire une app de A à Z. Du Swift concret, des exercices et les compromis qu’on rencontre en production.
Repérer le Massive View Controller, mesurer le couplage, cartographier les dépendances de votre app actuelle.
2 h 40Modéliser le métier en Swift pur. Value types, erreurs typées, async/await sans fuite d'abstraction.
throws(DomainError)35 minasync/await et concurrence stricte Swift 61 h 05Isoler le réseau et la persistance. URLSession, SwiftData, Core Data derrière la même interface.
3 h 55ViewModels @Observable, Presenters UIKit, coordinateurs de navigation. Le même domaine, deux interfaces.
@Observable et états d'écran1 h 02NavigationStack1 h 11Composition root, factories, environnement SwiftUI. Vous saurez exactement qui crée quoi.
3 h 05@Environment pour les dépendances SwiftUI41 minTests unitaires en millisecondes, test doubles écrits à la main, Swift Testing, snapshot tests ciblés.
4 h 30@Test, #expect et paramètres47 minsleep52 minDécouper l'app en packages locaux, réduire les temps de build, garder des frontières qui tiennent.
3 h 45La stratégie strangler fig appliquée à une vraie app de 80 000 lignes, écran par écran, sans geler les releases.
3 h 35« 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. »
RomainCe qui change au quotidien
Une règle métier dans le domaine. Un appel réseau dans un adapter. Chaque responsabilité a une adresse.
Des Use Cases testables sans réseau et sans simulateur. Un retour rapide à chaque changement.
Passer de UIKit à SwiftUI ou remplacer la persistance sans emporter tout le métier avec.
Ils ont testé la formule
Du code propre. Des retours qui le sont un peu moins.
« 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. »

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

« 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. »

« Mon
AppManager.sharedgé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. »

« 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. »

« 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. »

« 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. »

« 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. »

« 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. »

06 / Les formules
Un premier écran à remettre en ordre, une app entière à repenser ou une équipe à accompagner.
Pour tester la formule sur un premier écran.
149 €
Épuisé
La formule complète
La formation complète, pour un code propre de la cave au grenier.
490 €
Épuisé
Compatible CPF. Paiement en 3 fois sans frais.
Une journée d'atelier intensif avec toute votre équipe iOS, chez vous ou à distance.
14 000 €19 999,99 € 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. »
SophieMais attendez, ce n’est pas tout !
Inclus avec la formation complète, pour passer de la vidéo à votre projet :
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éUne bonne architecture se reconnaît au code qu’on peut changer sans avoir peur.
Le principe derrière chaque module.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.
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.
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.
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.
C'est même le sujet du dernier module. On migre écran par écran, sans réécriture complète et sans geler les releases.
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é.
Non. Nous déclinons toute responsabilité en cas de pull rétréci.
Clean Architecture iOS : la bonne formule pour vos prochaines apps.
Trouver ma formationCompatible CPF. Satisfait ou remboursé pendant 30 jours. Accès immédiat.