Swift Codable — a magia dos JSONS.

Eduardo Lombardi
3 min readOct 11, 2020
Photo by Chris Ried on Unsplash

A linguagem de programação swift, tem uma ferramenta muito poderosa para encoding e decoding de JSON. Geralmente à utilizamos quando fazemos uma requisição web e o resultado de alguma API (Application Programming Interface) vem neste formato, amplamente utilizado atualmente por sua simplicidade e padronização. Através deste artigo vou mostrar como podemos fazer o decode de um JSON customizado para um aplicativo de forma simples. Não vou tratar da requisição em si, mas isso pode ser visto em outros artigos muito bons, como este aqui.

Dado que temos o seguinte JSON de exemplo:

A primeira coisa, e primordial, é identificar quais são as informações e seus respectivos tipos.

  • Apesar de conterem informações claramente diferentes, os campos "name", "birth_date", "documentNumber" e "profile_pic", possuem o tipo String.
  • Temos um campo meio estranho ali, "retries", qual será o seu tipo?

Vamos começar pelo mais fácil:

Neste código acima, ainda temos algumas alterações a fazer. Note que a variável birthDate não bate com o campo "birth_date" do JSON. E agora? Coding Keys é a salvação:

Este enumerador de codingKeys (padrão, utilizado assim mesmo) tem em seus cases cada um dos campos do JSON e para os casos em que os nomes não batem você pode adicionar a associação correta para que o interpretador saiba o que fazer quando encontrar os nomes diferentes. Mas ainda temos alguns problemas aí: E se o campo "profile_pic", por exemplo, não vier no JSON? e o campo "retries" ?

Para os casos em que deu algum problema indesejado no backend e algum campo não veio ou está faltando, podemos realizar o tratamento usando o optional representado pelo caracter "?". Para saber ainda mais sobre optionals em swift, veja este ótimo artigo. No nosso caso, o interpretador vai inserir as informações nos lugares corretos, e caso uma informação não exista, ela será nil (ou nula). Aqui, eu optei por deixar todos os campos opcionais, mas isso vai de acordo com a sua estratégia, garantindo que a aplicação não quebre. Já estamos acabando…

Até o momento, trabalhamos apenas com tipos primitivos (String, Int, Double,…). Para o campo "retries" essa estratégia não funcionaria. Veja só o que aconteceu aqui: Precisamos criar um novo tipo customizado Retries. Simplismente criei este tipo e fiz o mapeamento seguindo o mesmo padrão da estrutura user. Desse jeito, o swift vai se resolver automagicamente.

Vamos ver este outro JSON aqui:

Putz, agora complicou, não? Não. A maioria do trabalho sujo já foi feita anteriormente. Este JSON representa apenas um aray de usuários do tipo que já vimos acima. (Ou seja, um conjunto com mais de um usuário). Vamos ver como fica o código para mapear isto:

Adicionamos uma estrutura dentro da outra, mas não ficou nada complexo. E fica fácil trabalhar com todos esses objetos. Temos um Array de usuários e podemos utilizar todos os métodos do swift para trabalhar com arrays, além de poder acessar qualquer propriedade de cada usuário, seja para mostrar em uma tela ou ainda passar para frente e utilizar em algum fluxo da sua aplicação.

Qualquer dúvida, deixa um comentário aqui. Se puder, deixa um clap também. E fica de olho nas minhas redes @eduardolomb no twitter que vou postar mais artigos sobre swift.

--

--