iOS e Swift: Conversão de dados com Codable (Encodable e Decodable)

iOS e Swift: Conversão de dados com Codable (Encodable e Decodable)
Giovanna Moeller
Giovanna Moeller

Compartilhe

Resumindo

Neste artigo, vamos entender como trabalhar com a conversão de dados em um projeto iOS utilizando o Codable, um recurso importante que permite a conversão entre os tipos de dados do Swift e alguma representação externa de dados, como JSON e XML. Veremos também:

  • O que significa Encodable e Decodable;
  • Como utilizá-los no nosso projeto para conversão de dados.

Depois de ler esse artigo, você vai conseguir compreender e utilizar da melhor maneira para utilizar dados na sua aplicação. Vamos lá?

Banner da Escola de Mobile: Matricula-se na escola de Mobile. Junte-se a uma comunidade de mais de 500 mil estudantes. Na Alura você tem acesso a todos os cursos em uma única assinatura; tem novos lançamentos a cada semana; desafios práticos. Clique e saiba mais!

Introdução

Quando criamos uma aplicação, precisamos trabalhar com dados. Esses dados podem vir de alguma fonte externa, por exemplo, uma API.

Porém, eles são retornados em um estilo diferente: normalmente, como JSON. JSON significa Javascript Object Notation, basicamente um formato leve de troca de informações/dados entre sistemas.

O JSON é representado em forma de texto. Veja um exemplo abaixo:

[
    {
        "nome": "Giovanna",
        "idade": 21,
        "profissao": "Desenvolvedora"
    },
    {
        "nome": "Ana",
        "idade": 25,
        "profissao": "Designer"
    }
]

No JSON acima, temos um array contendo dois objetos que representam uma pessoa, com seu nome, idade e profissão.

Imagine, agora, que nossa aplicação contenha uma lista de usuários que vieram de uma API externa, e os dados retornados foram exatamente esses do exemplo acima, em formato JSON. Até aí tudo bem, certo? O problema é que a linguagem Swift não consegue utilizar, ou seja, não “entende” os dados do tipo JSON, pois é um formato textual.

Portanto, como podemos realizar a conversão desses dados JSON em algum tipo de dado que conseguimos utilizar no Swift? Vamos ver isso logo a seguir!

Trabalhando com Decodable e Encodable

Antes de iniciar o tópico de conversão, precisamos entender que quando utilizamos o protocolo Encodable, estamos convertendo um tipo de dado do Swift em alguma representação como o JSON, esse é o processo de codificação.

Já o protocolo Decodable permite a conversão de alguma representação externa, como o JSON, em algum tipo de dado do Swift, sendo esse o processo de decodificação.

Vamos ver agora mais sobre o Decodable, vendo depois sobre o Encodable. Vamos lá?

Decodable

Para fins didáticos, crie um arquivo playground que pode ser chamado de Codable.playground no seu XCode. Nele, vamos trabalhar melhor esses conceitos de decodificação e codificação.

Veja que na nossa representação JSON, temos três propriedades no objeto: nome, idade e profissão. Portanto, vamos criar uma struct no Swift com essas mesmas propriedades:

struct Pessoa {
  var nome: String
  var idade: Int
  var profissao: String
}

Nesse mesmo arquivo, vamos colocar esse objeto JSON dentro de uma variável:

let json = """
  [
      {
          "nome": "Giovanna",
          "idade": 21,
          "profissao": "Desenvolvedora"
      },
      {
          "nome": "Ana",
          "idade": 25,
          "profissao": "Designer"
      }
  ]
"""

Agora, o que precisamos fazer é converter essa variável JSON em um array contendo instâncias do tipo Pessoa.

Primeiramente, precisamos converter essa variável json em um objeto do tipo Data(), porque é com isso que os decodificadores do tipo Codable funcionam. Basicamente, o tipo Data é usado para interagir com dados binários brutos. Portanto:

let dado = Data(json.utf8)

Lembrando que o utf8 representa a codificação de caracteres.

Agora, precisamos fazer também com que a struct "Pessoa" obedeça ao protocolo Codable, para que seja possível realizar a codificação e decodificação de um objeto:

struct Pessoa: Codable {
  var nome: String
  var idade: Int
  var profissao: String
}

Feito isso, vamos realizar a decodificação de fato desse JSON para um array de instâncias do tipo "Pessoa". Observe o código abaixo, e então vamos para as explicações:

let decoder = JSONDecoder()
do {
    let objetoDecodificado = try decoder.decode([Pessoa].self, from: dado)
    print(objetoDecodificado[0].nome) // "Giovanna"
} catch {
    print("Não foi possível decodificar o JSON")
}

Primeiramente, criamos uma variável decoder que inicializa uma instância do tipo JSONDecoder(). Essa classe define um objeto que decodifica instâncias de um tipo de dados de objetos JSON.

Depois disso, na segunda e terceira linhas, criamos um mecanismo para lidar com erros: o uso do do e catch. Caso a decodificação não seja concluída com sucesso, cairá dentro do catch() e printará na tela: "Não foi possível decodificar o JSON".

Criamos uma variável objetoDecodificado que realiza a decodificação de fato. Usamos um método da instância de JSONDecoder() chamado decode que faz a decodificação do JSON (em formato Data()) em um array do tipo "Pessoa".

E pronto! Dessa forma, realizamos a conversão de um dado do tipo JSON para um dado aceito pelo Swift.

E aí, deu pra entender melhor agora como é realizada uma decodificação?

Encodable

Agora que já vimos como decodificar um objeto JSON, vamos ver como codificá-lo, ou seja, tornar um tipo de dado no Swift em JSON.

Primeiramente, vamos criar uma instância da struct "Pessoa":

let pessoa = Pessoa(nome: "Giovanna", idade: 21, profissao: "Desenvolvedora")

O objetivo é justamente realizar a codificação dessa instância para um JSON. Da mesma maneira que criamos uma variável decoder como instância de uma classe JSONDecoder(), vamos fazer o mesmo com JSONEncoder() agora:

let encoder = JSONEncoder()

E então, realizar a codificação de fato da nossa variável pessoa:

do {
     let pessoaJSON = try encoder.encode(pessoa)
     print(String(data: pessoaJSON, encoding: .utf8))
} catch {
     print("Não foi possível realizar a codificação!")
}

Utilizamos o mesmo tratamento de erros que no processo de decodificação, o uso do do e catch. Nele, utilizamos um método da classe JSONEncoder() chamado de encode, passando como parâmetro a nossa instância pessoa.

E então, por fim, mostramos na tela o nosso objeto JSON com codificação de caracteres no formato utf-8.

Bem simples e parecido com o processo de decodificação, não é mesmo? E aí, curtiram?

Conclusão

Neste artigo, entendemos mais sobre conversão de dados utilizando o Codable.

Você também pode complementar seus estudos lendo mais sobre esse assunto na documentação.

Se você tem interesse em outros artigos ou quer conhecer mais sobre o desenvolvimento iOS, basta me procurar aqui: Linkedin.

Quer saber mais sobre iOS? Confira nosso curso para iniciantes aqui na Alura: Swift parte 1 - Desenvolvendo para iOS no Xcode.

Até a próxima!

Giovanna Moeller
Giovanna Moeller

Desenvolvedora de Software e Criadora de Conteúdo @girl.coding

Veja outros artigos sobre Mobile