0Pricing
Swift Academy · Aula

Composição de vários wrappers de propriedade

Empilhe wrappers de propriedade e compreenda a ordem de inicialização deles.

Composição de vários wrappers de propriedade é uma aula grátis de Swift Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Swift Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Swift Academy inclui 4 aulas no total.

Boas-vindas

Vários invólucros de propriedades podem ser aplicados a uma única propriedade. A ordem importa — os invólucros externos envolvem os internos — e a ordem de inicialização segue a ordem das declarações.

Empilhamento de encapsuladores

```swift @propertyWrapper struct A { var wrappedValue: Int { didSet { print("A") } } init(wrappedValue: Int) { self.wrappedValue = wrappedValue } } @propertyWrapper struct B { var wrappedValue: Int { didSet { print("B") } } init(wrappedValue: Int) { self.wrappedValue = wrappedValue } } struct S { @A @B var x = 0 } ```

O externo encapsula o interno

Ao escrever `@A @B var x`, a expansão sintática é: ```swift var _x: A> = A(wrappedValue: B(wrappedValue: 0)) ``` A encapsula B, que encapsula Int.

Exemplo real: @NonEmpty + @Trimmed

```swift @propertyWrapper struct Trimmed { var wrappedValue: String { didSet { wrappedValue = wrappedValue.trimmingCharacters(in:.whitespaces) } } init(wrappedValue: String) { self.wrappedValue = wrappedValue.trimmingCharacters(in:.whitespaces) } } @propertyWrapper struct NonEmpty { var wrappedValue: String { didSet { if wrappedValue.isEmpty { wrappedValue = "(empty)" } } } init(wrappedValue: String) { self.wrappedValue = wrappedValue.isEmpty ? "(empty)" : wrappedValue } } struct Form { @NonEmpty @Trimmed var username = " " } ```

Ordem de inicialização

Os encapsuladores são inicializados do mais externo para o mais interno. Isso significa que o inicializador do encapsulador externo recebe o resultado da transformação do encapsulador interno, e não o valor original.

Limitações do empilhamento

• Nem todos os encapsuladores podem ser compostos corretamente — verifique se os tipos de `wrappedValue` correspondem • O compilador do Swift talvez não permita vários encapsuladores em todos os casos (isso depende da compatibilidade dos tipos encapsulados) • O acesso a `projectedValue` por meio de `$x` alcança apenas a projeção do encapsulador mais externo

Exemplo em SwiftUI: @EnvironmentObject + observação

O SwiftUI não permite empilhar `@EnvironmentObject` e `@Published` na mesma propriedade, mas você pode observar modelos `@EnvironmentObject` que usam `@Published` internamente.

Depuração de encapsuladores empilhados

Use `_propertyName` para acessar diretamente a instância do encapsulador: ```swift print(form._username) // A> — the outer wrapper instance ```

Alternativa: compor dentro de um único encapsulador

Muitas vezes, é mais simples compor a lógica dentro de um único encapsulador: ```swift @propertyWrapper struct CleanUsername { var wrappedValue: String { didSet { wrappedValue = clean(wrappedValue) } } func clean(_ s: String) -> String { let t = s.trimmingCharacters(in:.whitespaces) return t.isEmpty ? "(empty)" : t } } ```

Padrões práticos de empilhamento

Empilhamentos válidos comuns: • `@UserDefault` + `@Published` (persistência de dados + observação) • `@NonNegative` + `@Clamped` (camadas de validação) • Específico do framework: `@Environment` + `@Binding` em visualizações do SwiftUI

Verificação rápida

Quando dois encapsuladores de propriedades são empilhados, qual é inicializado primeiro?

Recapitulação

Principais conclusões: • `@A @B var x` é expandido sintaticamente para `A>` • O encapsulador externo é inicializado usando o `wrappedValue` do interno como entrada • `$x` alcança apenas o `projectedValue` mais externo • `_x` acessa diretamente a instância do encapsulador • Prefira um único encapsulador composto a um empilhamento profundo quando possível Curso concluído! Próximo: tipo de resultado.

Perguntas Frequentes

A aula “Composição de vários wrappers de propriedade” é grátis?

Sim — o texto completo de “Composição de vários wrappers de propriedade” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Swift Academy, atualize para CoddyKit PRO. O curso de Swift Academy inclui 4 aulas no total.

O que vou aprender em “Composição de vários wrappers de propriedade”?

Empilhe wrappers de propriedade e compreenda a ordem de inicialização deles. Você pratica Swift Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Swift Academy?

Nenhuma experiência prévia é necessária. Swift Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Composição de vários wrappers de propriedade”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Swift Academy?

Sim. Cada aula de Swift Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Criação de um wrapper de propriedade personalizado
  2. Valores projetados com $binding
  3. @Published e observação no Combine
  4. Composição de vários wrappers de propriedade
← Voltar para Swift Academy