ViewModifier é um protocolo no SwiftUI que permite criar modificadores reutilizáveis para alterar a aparência e o comportamento das Views. De acordo com Apple Developer Documentation, 2024, ViewModifier requer a implementação do método body(content:), que recebe a View original e retorna uma modificada, encapsulando qualquer combinação de modificadores integrados em um único tipo. Sem este protocolo, os desenvolvedores teriam que repetir as mesmas cadeias de modificadores em cada ponto de uso.
Principais pontos
ViewModifier é um protocolo SwiftUI que define um contrato para criar modificadores que podem ser aplicados a qualquer tipo de View. Ele é declarado como protocol ViewModifier { associatedtype Body: View; func body(content: Content) -> Body }, onde Content é o tipo da View original passada ao modificador.
O protocolo ViewModifier apareceu no iOS 13 junto com a primeira versão do SwiftUI e permanece estável até iOS 18+ inclusive. O principal objetivo é fornecer aos desenvolvedores um mecanismo para encapsular cadeias de modificadores repetitivas em um único tipo reutilizável. Sem ViewModifier, toda vez que você precisasse aplicar o mesmo conjunto de estilos, teria que repetir manualmente todos os modificadores.
De acordo com Swift by Sundell (2023), ViewModifier é a forma preferida de organizar estilos em projetos SwiftUI quando o mesmo conjunto de modificadores é usado em três ou mais lugares. Para combinações únicas, uma cadeia de modificadores integrados diretamente na View é suficiente.
O protocolo ViewModifier requer a implementação de um método body(content:) e opcionalmente pode fornecer propriedades para personalizar o comportamento através dos parâmetros do inicializador do modificador personalizado.
O protocolo ViewModifier define o método body(content:), que recebe a View original (tipo Content) e retorna uma View modificada (tipo Body). SwiftUI aplica o modificador à View passando-a como content e usa o resultado para exibição.
struct CardStyle: ViewModifier {
func body(content: Content) -> some View {
content
.padding(16)
.background(Color.white)
.cornerRadius(12)
.shadow(radius: 4, x: 0, y: 2)
}
}
// Uso:
Text("Olá, SwiftUI!")
.modifier(CardStyle())
Quando você chama .modifier(CardStyle()), SwiftUI cria uma instância de ModifiedContent<Text, CardStyle> que armazena a View original e o modificador. Durante a renderização, SwiftUI chama CardStyle.body(content: text), obtendo uma View modificada com padding, background, cornerRadius e shadow.
Distinção importante: ViewModifier.body é chamado toda vez que a View é atualizada, portanto dentro de body não deve haver cálculos pesados ou efeitos colaterais. Se o modificador depende de dados externos (state, environment), passe-os através dos parâmetros do inicializador.
Os modificadores integrados do SwiftUI (font, foregroundColor, frame, padding) são métodos de extensão do protocolo View que retornam o tipo ModifiedContent. Eles não implementam ViewModifier diretamente — SwiftUI usa implementações internas otimizadas para cada modificador integrado.
| Característica | Modificadores integrados | ViewModifier personalizado |
|---|---|---|
| Implementação | Métodos de extensão de View | Protocolo ViewModifier |
| Reutilização | Cadeia única | Uso múltiplo |
| Parâmetros | Fixos (cor, tamanho) | Qualquer através do inicializador |
| Desempenho | Máximo (otimizações internas) | Ligeiramente maior sobrecarga |
| Tipo de retorno | ModifiedContent | ModifiedContent |
ViewModifier personalizado se justifica quando a mesma combinação de modificadores é usada em dois ou mais lugares. Para usos únicos, é preferível uma cadeia direta de modificadores — o código permanece legível e o compilador otimiza melhor.
De acordo com WWDC 2023, a Apple recomenda criar ViewModifier personalizados para estilos relacionados ao sistema de design da aplicação: cartões, botões, campos de entrada. Isso garante consistência e simplifica a manutenção quando o design muda.
Padrão 1: encapsulamento do sistema de design. O caso de uso mais comum do ViewModifier é criar uma única fonte de verdade para os estilos visuais em uma aplicação. Cada elemento do sistema de design (cartão, botão, cabeçalho) tem seu próprio modificador.
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)
}
}
Padrão 2: aplicação condicional do modificador. Às vezes você precisa aplicar um modificador apenas sob uma condição específica. Um ViewModifier com um parâmetro booleano permite encapsular essa lógica dentro de body.
Padrão 3: composição de modificadores. Um ViewModifier pode aplicar outros ViewModifier dentro do seu body. Isso permite construir uma hierarquia de modificadores, onde cada um é responsável pelo seu próprio aspecto da apresentação visual. Por exemplo, CardStyle pode internamente aplicar ShadowStyle e BorderStyle.
De acordo com Point-Free (2024), a composição de modificadores através de ViewModifier é preferível à herança: cada modificador é responsável por uma tarefa e podem ser combinados independentemente. Isso segue o princípio de responsabilidade única no SwiftUI.
O desempenho do ViewModifier depende do número de invólucros ModifiedContent criados com cada aplicação. SwiftUI otimiza as cadeias de modificadores através de diffing na etapa de renderização, mas um número excessivo de modificadores pode retardar as atualizações.
| Número de modificadores | Impacto no desempenho | Recomendação |
|---|---|---|
| 1–5 | Mínimo | Normal para qualquer View |
| 5–10 | Moderado | Agrupar em ViewModifier |
| 10–20 | Notável | Combinar em um modificador personalizado |
| 20+ | Crítico | Reconsiderar a arquitetura da View |
Otimização: combine vários modificadores sequenciais do mesmo tipo (por exemplo, vários padding) em um só. Use PreferenceKey apenas quando realmente necessário — modificadores que leem preferências disparam uma passagem de renderização adicional.
Regra prática: se uma View tem mais de 10 modificadores — extraia alguns deles para um ViewModifier personalizado. Isso melhorará a legibilidade e permitirá que o SwiftUI otimize as atualizações. De acordo com SwiftUI Lab (2024), agrupar modificadores em um ViewModifier reduz o tempo de renderização em 15–30% para Views complexas.
Perguntas frequentes
ViewModifier é um protocolo para criar modificadores reutilizáveis que alteram a aparência ou o comportamento de uma View. Requer a implementação do método body(content:), que recebe a View original e retorna uma modificada.
Modificadores integrados (font, padding) são métodos de extensão do protocolo View que usam implementações internas otimizadas. ViewModifier é um protocolo para modificadores personalizados que encapsulam uma combinação dos integrados e podem ter parâmetros de inicializador.
Crie um ViewModifier personalizado quando a mesma combinação de modificadores é usada em três ou mais lugares. Para cadeias únicas, use modificadores diretamente na View — é mais simples e eficiente.
Sim, um ViewModifier pode conter propriedades @State ou @Environment. SwiftUI gerencia seu ciclo de vida da mesma forma que para View. No entanto, lembre-se que body é chamado em cada atualização, portanto evite operações pesadas no corpo do modificador.
Use if/else dentro de @ViewBuilder ou crie um modificador com um parâmetro booleano que aplica ou omite alterações condicionalmente dentro de body. Por exemplo, PrimaryButton acima usa isEnabled para aplicação condicional do estilo.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também