iOS e Swift: Conversão de dados com Codable (Encodable e Decodable)
![iOS e Swift: Conversão de dados com Codable (Encodable e Decodable)](assets/ios-swift-conversao-dados-codable-encodable-decodable/ios-swift-conversao-dados-codable-encodable-decodable.jpg)
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!](assets/alura-matricula-maior-escola-tecnologia-brasil-mais-500-mil-estudantes/matricula-escola-mobile-alura-saiba-mais-versao-mobile.png)
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!