Você sabe o que são Property Wrappers? (Parte 1)

Marcos Ferreira
3 min readJul 9, 2022

--

Photo by Tonik on Unsplash

Apresentada na WWDC19 as Property Wrappers trouxeram uma nova forma de se monitorar alterações de estados em propriedades auxiliada pela facilidade de uso de uma annotation, as famosas @, para quem assim como eu veio da época do Objective-C, vai se lembrar bem das declarações como:

  • @IBAction
  • @IBOutlet
  • @UIApplicationMain

Entre outros, não é mesmo! 😎

Graças a este poder introduzido no Swift 5.1, e diga-se de passagem, muito útil, agora podemos introduzir comportamentos e lógicas complexas diretamente em nossas propriedades. O grande diferencial em sua utilização é podermos nos beneficiar de reutilização de código e generalização de códigos que antes poderiam ser replicados várias e várias vezes, ou até mesmo, estarem centrados em um objeto que seria chamado para sua utilização.

Não há nada de errado nesse approach. Não me entendam mal! 🙃

Entretanto, podemos tornar nossas implementações mais robustas e prover uma reutilização de código ainda maior, vou dar alguns exemplos a seguir:

  • Criando uma Property Wrapper para capitalizar Strings

Para demonstrar o poder das Property Wrappers vamos iniciar com um exemplo mais "simples", imagine que queiramos criar uma anotação que irá capitalizar Strings definidas em uma entidade de usuário qualquer:

Com isso em mente, podemos definir nossa entidade User conforme o exemplo a seguir:

Poderíamos apenas utilizar, por exemplo, user.firstName.captalized para capitalizar a nossa propriedade, todavia, o intuito, é mostrar como podemos incorporar esse comportamento as anotações e deixar nosso código mais simples e legível.

Agora vamos definir a estrutura da nossa Property Wrapper, lembrando que elas podem ser utilizadas tanto em Structs quando em Classes, para tanto, basta marcar sua entidade com a anotação @propertyWrapper , vejamos então como ficaria o código, irei chamar nossa anotação de Capitalized:

Como mencionado anteriormente, o trecho acima, define nossa Property Wrapper chamada Capitalized e ela declara uma variável do tipo String com o nome de wrappedValue e também declara um construtor init que recebe uma String. Repare ainda, que ao realizar o set dentro do init, chamamos o método capitalized declarado na própria classe String para realizar a conversão da primeira letra para maiúscula.

Também definimos um observer para o evento didSet da variável wrappedValue realizando a mesma operação, isso se faz necessário pois, desta forma, poderemos utilizar nossa anotação tanto na construção direta de uma nova instância de String, quanto numa declaração de um valor padrão para a mesma, dessa forma, se o valor de nosso atributo for alterado, ele automaticamente será atualizado com sua forma capitalizada.

Vamos agora atualizar nossa entidade User para utilizarmos nossa Property Wrapper, ficando dessa forma:

Não foi fácil?! Agora podemos construir instâncias de nossa entidade User e vermos como ela se comportará, para isso, observe o trecho de código abaixo:

Vamos entender o que aconteceu no código acima, primeiro declaramos uma variável e inicializamos a mesma com uma referência de User, repare que fornecemos as Strings para o primeiro nome e último nome sendo respectivamente marcos e lacerda.

O comentário logo na sequência "simboliza" um print dos valores das 2 propriedades logo após a criação da variável user. Como num "passe de mágica" os valores que foram fornecidos em lowerCase, assumiram seus respectivos valores capitalizados.

E logo em seguida, modificamos o valor do atributo lastName com o valor ferreira também em lowerCase. Novamente, simulamos um print e para nossa surpresa (ou não 😆) o valor esta capitalizado.

Para encerrar esse primeiro artigo sobre as Property Wrappers, apresento abaixo uma outra forma de declarar um atributo usando nossa anotação juntamente com um valor padrão inicial para a mesma:

Nada muito diferente do que já foi apresentado até agora, todavia, é bom mostrar a flexibilidade que temos para usarmos as anotações.

Bom pessoal, vou ficando por aqui, espero que tenham gostado dessa primeira parte, e espero que este pequeno exemplo possa trazer e fomentar muitas idéias de como vocês podem aplicar o poder delas no seu dia a dia.

Na próxima parte, iremos explorar formas mais robustas de aplicarmos as Property Wrappers e consequentemente a utilização de códigos mais complexos para elevar o nível de nossos códigos.

Até a próxima e nos vemos por aí!

Valeu!

--

--