ViewModifier est un protocole dans SwiftUI qui permet de créer des modificateurs réutilisables pour changer l’apparence et le comportement des Views. Selon Apple Developer Documentation, 2024, ViewModifier nécessite l’implémentation de la méthode body(content:), qui prend la View originale et retourne une View modifiée, encapsulant toute combinaison de modificateurs intégrés en un seul type. Sans ce protocole, les développeurs devraient répéter les mêmes chaînes de modificateurs à chaque point d’utilisation.
Points clés
ViewModifier est un protocole SwiftUI qui définit un contrat pour créer des modificateurs pouvant être appliqués à tout type de View. Il est déclaré comme protocol ViewModifier { associatedtype Body: View; func body(content: Content) -> Body }, où Content est le type de la View originale passée au modificateur.
Le protocole ViewModifier est apparu dans iOS 13 avec la première version de SwiftUI et reste stable jusqu’à iOS 18+ inclus. L’objectif principal est de fournir aux développeurs un mécanisme pour encapsuler les chaînes de modificateurs répétitives en un seul type réutilisable. Sans ViewModifier, chaque fois que vous deviez appliquer le même ensemble de styles, vous deviez répéter manuellement tous les modificateurs.
Selon Swift by Sundell (2023), ViewModifier est la façon préférée d’organiser les styles dans les projets SwiftUI lorsque le même ensemble de modificateurs est utilisé dans trois endroits ou plus. Pour les combinaisons uniques, une chaîne de modificateurs intégrés directement sur la View suffit.
Le protocole ViewModifier nécessite l’implémentation d’une méthode body(content:) et peut facultativement fournir des propriétés pour personnaliser le comportement via les paramètres de l’initialisateur du modificateur personnalisé.
Le protocole ViewModifier définit la méthode body(content:), qui reçoit la View originale (type Content) et retourne une View modifiée (type Body). SwiftUI applique le modificateur à la View en la passant comme content et utilise le résultat pour l’affichage.
struct CardStyle: ViewModifier {
func body(content: Content) -> some View {
content
.padding(16)
.background(Color.white)
.cornerRadius(12)
.shadow(radius: 4, x: 0, y: 2)
}
}
// Utilisation :
Text("Bonjour, SwiftUI !")
.modifier(CardStyle())
Lorsque vous appelez .modifier(CardStyle()), SwiftUI crée une instance de ModifiedContent<Text, CardStyle> qui stocke la View originale et le modificateur. Pendant le rendu, SwiftUI appelle CardStyle.body(content: text), obtenant une View modifiée avec padding, background, cornerRadius et shadow.
Distinction importante : ViewModifier.body est appelé chaque fois que la View est mise à jour, donc à l’intérieur de body, il ne doit y avoir ni calculs lourds ni effets secondaires. Si le modificateur dépend de données externes (state, environment), transmettez-les via les paramètres de l’initialisateur.
Les modificateurs intégrés de SwiftUI (font, foregroundColor, frame, padding) sont des méthodes d’extension du protocole View qui retournent le type ModifiedContent. Ils n’implémentent pas ViewModifier directement — SwiftUI utilise des implémentations internes optimisées pour chaque modificateur intégré.
| Caractéristique | Modificateurs intégrés | ViewModifier personnalisé |
|---|---|---|
| Implémentation | Méthodes d’extension de View | Protocole ViewModifier |
| Réutilisation | Chaîne unique | Utilisation multiple |
| Paramètres | Fixes (couleur, taille) | Quels qu’ils soient via l’initialisateur |
| Performances | Maximum (optimisations internes) | Légèrement plus de surcharge |
| Type de retour | ModifiedContent | ModifiedContent |
ViewModifier personnalisé se justifie lorsque la même combinaison de modificateurs est utilisée dans deux endroits ou plus. Pour les utilisations uniques, une chaîne directe de modificateurs est préférable — le code reste lisible et le compilateur optimise mieux.
Selon WWDC 2023, Apple recommande de créer des ViewModifier personnalisés pour les styles liés au système de design de l’application : cartes, boutons, champs de saisie. Cela garantit la cohérence et simplifie la maintenance lors des changements de design.
Modèle 1 : encapsulation du système de design. Le cas d’utilisation le plus courant de ViewModifier est de créer une source unique de vérité pour les styles visuels dans une application. Chaque élément du système de design (carte, bouton, en-tête) obtient son propre modificateur.
struct PrimaryButton: ViewModifier {
var isEnabled: Bool
func body(content: Content) -> some View {
content
.font(.headline.weight(.semibold))
.foregroundColor(.white)
.padding(EdgeInsets(top: 12, leading: 24, bottom: 12, trailing: 24))
.background(isEnabled ? Color.blue : Color.gray)
.cornerRadius(8)
.opacity(isEnabled ? 1.0 : 0.6)
}
}
Modèle 2 : application conditionnelle du modificateur. Parfois, vous devez appliquer un modificateur seulement sous une certaine condition. Un ViewModifier avec un paramètre booléen permet d’encapsuler cette logique à l’intérieur de body.
Modèle 3 : composition de modificateurs. Un ViewModifier peut appliquer d’autres ViewModifier à l’intérieur de son body. Cela permet de construire une hiérarchie de modificateurs, où chacun est responsable de son propre aspect de la présentation visuelle. Par exemple, CardStyle peut appliquer en interne ShadowStyle et BorderStyle.
Selon Point-Free (2024), la composition de modificateurs via ViewModifier est préférable à l’héritage : chaque modificateur est responsable d’une tâche et ils peuvent être combinés indépendamment. Cela suit le principe de responsabilité unique dans SwiftUI.
Les performances de ViewModifier dépendent du nombre d’enveloppes ModifiedContent créées à chaque application. SwiftUI optimise les chaînes de modificateurs par diffing lors de l’étape de rendu, mais un nombre excessif de modificateurs peut ralentir les mises à jour.
| Nombre de modificateurs | Impact sur les performances | Recommandation |
|---|---|---|
| 1–5 | Minime | Normal pour toute View |
| 5–10 | Modéré | Regrouper dans ViewModifier |
| 10–20 | Notable | Combiner en un modificateur personnalisé |
| 20+ | Critique | Revoir l’architecture de la View |
Optimisation : combinez plusieurs modificateurs séquentiels du même type (par exemple, plusieurs padding) en un seul. Utilisez PreferenceKey seulement lorsque c’est vraiment nécessaire — les modificateurs qui lisent les préférences déclenchent un passage de rendu supplémentaire.
Règle pratique : si une View a plus de 10 modificateurs — extrayez certains d’entre eux dans un ViewModifier personnalisé. Cela améliorera la lisibilité et permettra à SwiftUI d’optimiser les mises à jour. Selon SwiftUI Lab (2024), regrouper les modificateurs dans un ViewModifier réduit le temps de rendu de 15 à 30 % pour les Views complexes.
Foire aux questions
ViewModifier est un protocole pour créer des modificateurs réutilisables qui changent l’apparence ou le comportement d’une View. Il nécessite l’implémentation de la méthode body(content:), qui prend la View originale et retourne une View modifiée.
Les modificateurs intégrés (font, padding) sont des méthodes d’extension du protocole View qui utilisent des implémentations internes optimisées. ViewModifier est un protocole pour les modificateurs personnalisés qui encapsulent une combinaison des modificateurs intégrés et peuvent avoir des paramètres d’initialisateur.
Créez un ViewModifier personnalisé lorsque la même combinaison de modificateurs est utilisée dans trois endroits ou plus. Pour les chaînes uniques, utilisez des modificateurs directement sur la View — c’est plus simple et plus performant.
Oui, un ViewModifier peut contenir des propriétés @State ou @Environment. SwiftUI gère leur cycle de vie de la même manière que pour View. Cependant, rappelez-vous que body est appelé à chaque mise à jour, évitez donc les opérations lourdes dans le corps du modificateur.
Utilisez if/else à l’intérieur de @ViewBuilder ou créez un modificateur avec un paramètre booléen qui applique ou saute conditionnellement les changements à l’intérieur de body. Par exemple, PrimaryButton ci-dessus utilise isEnabled pour l’application conditionnelle du style.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi