Cómo instalar Realm Swift en Xcode

Resumen

Integrar Realm en una app iOS te permite manejar persistencia de datos sin depender de Swift Data. Si trabajas con Swift y Xcode, aprenderás a instalar la dependencia, modelar entidades y guardar registros en una base de datos local con un patrón limpio y desacoplado.

Cómo instalas Realm Swift con Swift Package Manager

La instalación parte desde el repositorio oficial de Realm Swift Mobile Database. Copias la URL del repo, entras a Xcode y vas a File > Add package dependencies. Pegas la URL en la barra de búsqueda, seleccionas el paquete recomendado y lo agregas a tu target, en este caso Gastify.

De las opciones que aparecen, la que necesitas es Realm Swift. Una vez agregado, Xcode descarga las dependencias de Realm y Realm Database. Compila el proyecto para verificar que nada se rompió antes de seguir.

¿Qué es Swift Package Manager? Es la herramienta nativa de Apple para gestionar dependencias externas en proyectos Swift, integrada directamente en Xcode.

Cómo organizas la estructura de carpetas para Realm

Replicar la organización que ya tienes con Swift Data ayuda a mantener el código limpio y predecible. Crea una carpeta llamada RealmDatabaseService y dentro otra subcarpeta Entities para alojar los modelos.

Esta separación cumple un objetivo claro: que cada motor de persistencia tenga su propio espacio sin mezclar responsabilidades. Así puedes intercambiar implementaciones cumpliendo un mismo protocolo.

Cómo defines una entidad RMRecord en Realm

Dentro de Entities creas un archivo Swift llamado RMRecord. Importas RealmSwift y declaras una clase que hereda de Object, el tipo base que indica que esa clase es compatible con la base de datos de Realm.

Las propiedades se marcan con el decorador @Persisted, que le dice a Realm qué variables debe almacenar. La estructura queda así:

  • recordID como llave primaria.
  • title de tipo string.
  • date de tipo fecha.
  • type de tipo string.
  • amount numérico.

¿Para qué sirve @Persisted en Realm? Es un property wrapper que marca una propiedad para ser almacenada en la base de datos local de Realm.

Cómo conviertes RMRecord usando ToRecordProtocol

Igual que hiciste con la entidad de Swift Data, creas una extension del RMRecord que sea conforme al ToRecordProtocol. Implementas la función toRecord() que devuelve un Record mapeando cada propiedad: el recordID, el title, la date, el type reconstruido como RecordType desde su valor crudo, y el amount.

Esta capa de mapeo es clave para que tu app no dependa directamente de los modelos de Realm en las capas superiores.

Cómo implementas RMDatabaseService conforme al protocolo

Dentro de la carpeta RealmDatabase creas el archivo RMDatabaseService, una clase que implementa tu DatabaseServiceProtocol. Importas RealmSwift y agregas el decorador @MainActor a la clase para que las funciones se ejecuten en el hilo principal, igual que hiciste con Swift Data.

A diferencia de Swift Data, donde necesitas un container y un context inicializados en un init, en Realm basta con declarar una variable que instancia un objeto Realm. Esa variable es la base de datos que usarás en todas las funciones.

Cómo guardas un nuevo registro con saveNewRecord

La función para agregar un registro vive dentro de un bloque do-catch. Si algo falla, retornas false. Dentro del do haces dos cosas:

  1. Creas una instancia vacía de RMRecord y le asignas cada propiedad desde el record que llega por parámetro.
  2. Para el type, usas record.type.rawValue porque el modelo guarda strings, no el enum directamente.

Luego ejecutas la escritura con try realm.write { self.realm.add(realmRecord) }. Si la operación se completa sin errores, retornas true. Si lanza una excepción, el catch devuelve false.

¿Por qué usar realm.write en Realm? Es el bloque obligatorio para cualquier operación de escritura en la base de datos; garantiza transacciones seguras y consistentes.

Qué sigue después de configurar Realm en Xcode

Con Realm instalado, la entidad RMRecord modelada y la función saveNewRecord lista, ya tienes la base para persistir información local desde tu servicio. Falta cubrir la lectura con filtros y validar que todo el flujo siga compilando correctamente junto con la implementación previa de Swift Data.

¿Has integrado Realm en alguno de tus proyectos? Cuéntame en los comentarios qué diferencias notaste frente a Swift Data o Core Data.