Conceptos: Modelos de objetos y relaciones
El modelado de datos para SwiftUI se basa en el mismo modelo de objetos y conceptos de relación del SDK de Swift. Si no está familiarizado con los conceptos de modelado de datos del SDK de Swift de Realm, consulte: Definir un modelo de objetos de Realm - SDK de Swift.
Vinculación del modelo de objetos a la interfaz de usuario
El patrón de diseño Modelo-Vista-Modelo de Vista (MVVM) propone crear un modelo de vista que lo abstraiga del código de la vista. Si bien es posible hacerlo con Realm, el SDK de Swift proporciona herramientas que facilitan el trabajo directo con los datos en las vistas de SwiftUI. Estas herramientas incluyen:
Envoltorios de propiedades que crean enlaces a objetos observables subyacentes
Una clase para proyectar y transformar objetos del modelo subyacente para su uso en vistas específicas
Transformación de datos para vistas de SwiftUI
El SDK de Realm Swift proporciona un tipo especial de objeto, llamado Proyección: para transformar y trabajar con subconjuntos de datos. Considere una proyección similar a un modelo de vista. Permite pasar por las propiedades del objeto original o transformarlas de diferentes maneras:
Passthrough: la propiedad de la proyección tiene el mismo nombre y tipo que el objeto original.
Cambiar nombre: La propiedad de la proyección tiene el mismo tipo que el objeto original, pero un nombre diferente.
Resolución de ruta clave: use esto para acceder a propiedades específicas del objeto proyectado.
Mapeo de colecciones: puede mapear algunos tipos de colecciones a una colección de valores primitivos.
Exclusión: Todas las propiedades del objeto Realm original no definidas en el modelo de proyección. Cualquier cambio en dichas propiedades no activa una notificación de cambio al observar la proyección.
Cuando se utiliza una proyección, se obtienen todos los beneficios de los objetos activos de Realm:
Las actualizaciones en vivo del objeto proyectado por la clase
Puedes observar los cambios.
Puede aplicar cambios directamente a las propiedades en transacciones de escritura
Definir un nuevo objeto
Puedes definir un objeto Realm derivando de la clase Object o EmbeddedObject. El nombre de la clase se convierte en el nombre de la tabla en el reino, y sus propiedades persisten en la base de datos. Esto facilita el trabajo con objetos persistentes tanto como con objetos Swift normales.
La documentación de Realm SwiftUI utiliza un modelo para una aplicación ficticia, DoggoDB. Esta aplicación es un directorio de empleados de la empresa con perros. Permite compartir información sobre sus perros con otros empleados.
El modelo de datos incluye un objeto Persona, con una relación de varios con los objetos Perro de esa persona. También utiliza un tipo de dato especial del SDK de Swift de Realm, PersistableEnum, para almacenar información sobre la unidad de negocio de la persona.
class Person: Object, ObjectKeyIdentifiable { (primaryKey: true) var _id: ObjectId var firstName = "" var lastName = "" var personId = "" var company = "MongoDB" var businessUnit = BusinessUnitEnum.engineering var profileImageUrl: URL? var dogs: List<Dog> } enum BusinessUnitEnum: String, PersistableEnum, CaseIterable { case customerEngineering = "Customer Engineering" case educationCommunityAndDocs = "Education, Community and Docs" case engineering = "Engineering" case financeAndOperations = "Finance and Operations" case humanResourcesAndRescruiting = "Human Resources and Recruiting" case management = "Management" case marketing = "Marketing" case product = "Product" case sales = "Sales" } class Dog: Object, ObjectKeyIdentifiable { (primaryKey: true) var _id: UUID var name = "" var breed = "" var weight = 0 var favoriteToy = "" var profileImageUrl: URL? var dateLastUpdated = Date() (originProperty: "dogs") var person: LinkingObjects<Person> var firstLetter: String { guard let char = name.first else { return "" } return String(char) } }
Tip
Para obtener detalles completos sobre cómo definir un modelo de objeto Realm, consulte:
Definir una proyección
Nuestra aplicación ficticia DoggoDB tiene una vista de perfil de usuario. Esta vista muestra algunos detalles sobre la persona, pero no necesitamos todas sus propiedades. Person Modelo. Podemos crear una proyección con solo los detalles que queramos. También podemos modificar la lastName propiedad para usar solo la inicial del apellido.
class Profile: Projection<Person> { (\Person.firstName) var firstName // Passthrough from original object (\Person.lastName.localizedCapitalized.first) var lastNameInitial // Access and transform the original property (\Person.personId) var personId (\Person.businessUnit) var businessUnit (\Person.profileImageUrl) var profileImageUrl (\Person.dogs) var dogs }
Podemos utilizar esta proyección en la vista de perfil en lugar del objeto original Person.
La proyección de clase funciona con envoltorios de propiedades SwiftUI:
Tip
Para obtener un ejemplo completo del uso de una proyección de clase en una aplicación SwiftUI, consulte la aplicación de ejemplo Proyecciones.