Serialização de objetos em Swift: Codable, NSCoding e JSONEncoder

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Serialização de objetos em Swift (iOS/macOS)

Serialização é o processo de converter objetos complexos (estruturas, classes, instâncias) em um formato adequado para armazenamento ou transmissão pela rede (JSON, Property List, dados binários). Desserialização é o processo inverso de restaurar o objeto a partir desses dados. Em Swift para iOS e macOS, existem duas abordagens principais: o protocolo moderno Codable (e seus componentes Encodable e Decodable) e o mais antigo NSCoding do framework Foundation. Neste artigo, vamos detalhar ambas as abordagens com exemplos de código.



1. Protocolo Codable (forma recomendada)

Codable é um protocolo que combina Encodable e Decodable. Ele permite gerar automaticamente o código para serialização e desserialização, se todas as propriedades da sua estrutura ou classe também estiverem em conformidade com Codable (strings, números, datas, arrays, dicionários, etc.).



1.1. Serialização básica em JSON

Vamos considerar uma estrutura simples de usuário:

import Foundation

struct User: Codable { let id: Int var name: String var email: String}

// Criando uma instâncialet user = User(id: 1, name: "João Silva", email: "joao@example.com")

// Serialização em Data (JSON)let encoder = JSONEncoder()encoder.outputFormatting = .prettyPrinted // para saída legível

do { let jsonData = try encoder.encode(user) if let jsonString = String(data: jsonData, encoding: .utf8) { print(jsonString) }} catch { print("Erro de serialização: \\(error.localizedDescription)")}


1.2. Desserialização de JSON

// Suponha que temos uma string JSONlet jsonString = """{    "id": 2,    "name": "Maria Souza",    "email": "maria@teste.com"}"""

let jsonData = Data(jsonString.utf8)let decoder = JSONDecoder()

do { let decodedUser = try decoder.decode(User.self, from: jsonData) print("Nome: \\(decodedUser.name), Email: \\(decodedUser.email)")} catch { print("Erro de desserialização: \\(error.localizedDescription)")}


1.3. Personalização de chaves (CodingKeys)

Se os nomes das propriedades em Swift forem diferentes das chaves no JSON, use a enumeração CodingKeys:

struct Article: Codable {    var title: String    var body: String    var publicationDate: Date

enum CodingKeys: String, CodingKey { case title case body case publicationDate = "published_at" // chave no JSON }}

let articleJSON = """{"title":"Swift Codable","body":"Texto do artigo","published_at":"2024-01-15T10:00:00Z"}"""let articleData = Data(articleJSON.utf8)let decoder = JSONDecoder()decoder.dateDecodingStrategy = .iso8601 // para parsing correto da data

if let article = try? decoder.decode(Article.self, from: articleData) { print("Título: \\(article.title), Data: \\(article.publicationDate)")}


1.4. PropertyListEncoder / PropertyListDecoder

Para serialização no formato Property List (XML ou binário), use PropertyListEncoder:

let plistEncoder = PropertyListEncoder()plistEncoder.outputFormat = .xml

if let plistData = try? plistEncoder.encode(user) { // plistData pode ser salvo em um arquivo let plistString = String(data: plistData, encoding: .utf8) print(plistString ?? "Dados inválidos")}


2. Protocolo NSCoding (para classes que herdam de NSObject)

NSCoding é um protocolo do Objective-C que ainda é usado para serialização de classes, especialmente aquelas que trabalham com UIKit/AppKit (por exemplo, UIView, UIViewController). Ele exige que a classe herde de NSObject e implemente os métodos encode(with:) e init?(coder:).



2.1. Exemplo de classe com NSCoding

                    

Recommendations