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
Também na biblioteca
PDFKit para JavaScript (Node.js): guia completo com exemplos
Playwright para JavaScript (Node.js): guia completo com exemplos
Agendador de tarefas em Node.js: node-schedule e node-cron
Configuração de aplicativos Swift: biblioteca SwiftyConfig