Serialización de objetos en Swift: Codable, NSCoding y JSONEncoder

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Serialización de objetos en Swift (iOS/macOS)

La serialización es el proceso de convertir objetos complejos (estructuras, clases, instancias) en un formato adecuado para almacenamiento o transmisión por red (JSON, Property List, datos binarios). La deserialización es el proceso inverso de restaurar el objeto a partir de estos datos. En Swift para iOS y macOS existen dos enfoques principales: el protocolo moderno Codable (y sus componentes Encodable y Decodable) y el más antiguo NSCoding del framework Foundation. En este artículo analizaremos ambos enfoques en detalle con ejemplos de código.



1. Protocolo Codable (método recomendado)

Codable es un protocolo que combina Encodable y Decodable. Permite generar automáticamente código para serialización y deserialización si todas las propiedades de su estructura o clase también cumplen con Codable (cadenas, números, fechas, arreglos, diccionarios, etc.).



1.1. Serialización básica a JSON

Consideremos una estructura simple de usuario:

import Foundation

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

// Creamos una instancialet user = User(id: 1, name: "Iván Petrov", email: "ivan@example.com")

// Serialización a Data (JSON)let encoder = JSONEncoder()encoder.outputFormatting = .prettyPrinted // para salida legible

do { let jsonData = try encoder.encode(user) if let jsonString = String(data: jsonData, encoding: .utf8) { print(jsonString) }} catch { print("Error de serialización: \\(error.localizedDescription)")}


1.2. Deserialización desde JSON

// Supongamos que tenemos una cadena JSONlet jsonString = """{    "id": 2,    "name": "María Smirnova",    "email": "maria@test.com"}"""

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

do { let decodedUser = try decoder.decode(User.self, from: jsonData) print("Nombre: \\(decodedUser.name), Email: \\(decodedUser.email)")} catch { print("Error de deserialización: \\(error.localizedDescription)")}


1.3. Personalización de claves (CodingKeys)

Si los nombres de las propiedades en Swift difieren de las claves en JSON, use la enumeración 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" // clave en JSON }}

let articleJSON = """{"title":"Swift Codable","body":"Texto del artículo","published_at":"2024-01-15T10:00:00Z"}"""let articleData = Data(articleJSON.utf8)let decoder = JSONDecoder()decoder.dateDecodingStrategy = .iso8601 // para analizar correctamente la fecha

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


1.4. PropertyListEncoder / PropertyListDecoder

Para serializar al formato Property List (XML o binario) use PropertyListEncoder:

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

if let plistData = try? plistEncoder.encode(user) { // plistData se puede guardar en un archivo let plistString = String(data: plistData, encoding: .utf8) print(plistString ?? "Datos incorrectos")}


2. Protocolo NSCoding (para clases que heredan de NSObject)

NSCoding es un protocolo de Objective-C que todavía se usa para serializar clases, especialmente aquellas que trabajan con UIKit/AppKit (por ejemplo, UIView, UIViewController). Requiere que la clase herede de NSObject e implemente los métodos encode(with:) y init?(coder:).



2.1. Ejemplo de clase con NSCoding

                    

Recommendations