🔍 La macro @Query de SwiftData nos permite consultar datos persistentes de forma declarativa, pero muchos desarrolladores no saben que puede volverse completamente dinámico cuando lo necesitamos.
⚡ El problema surge cuando intentas usar @State directamente en un predicado: SwiftData no puede acceder a propiedades de instancia durante la inicialización de @Query. La solución está en la arquitectura de vistas.
🏗️ El patrón correcto implica separar responsabilidades: una vista contenedora maneja el estado dinámico (filtros, búsquedas, ordenación) y una subvista ejecuta el @Query recibiendo parámetros por inyección de dependencias.
🎯 Dentro del inicializador de la subvista, accedes al Query subyacente mediante el guion bajo:. así creas consultas completamente personalizadas en tiempo de ejecución.
init() {
_users = Query(filter: #Predicate {
...
}, sort: sortOrder)
}
🔄 Esta técnica funciona con cualquier combinación: predicados compuestos, ordenación múltiple, búsquedas de texto y fechas. SwiftUI recrea automáticamente la subvista cuando cambias los parámetros, regenerando el Query.
🚀 Lo más interesante es el rendimiento: usar #Predicate filtra directamente en la base de datos (SQL), no en memoria como .filter() haría. Esto es órdenes de magnitud más rápido con grandes volúmenes de datos.
⚠️ Existe una limitación importante: los enum personalizados no funcionan directamente en SortDescriptor o predicados. También existen otros métodos que no se pueden utilizar pero es cuestión de ir probando.
💡 Para casos avanzados, puedes combinar expresiones dentro de predicados: contar relaciones, aplicar condiciones anidadas o usar operadores lógicos complejos. Todo evaluado eficientemente por SwiftData.
🛠️ Desde iOS 18, la macro #Index acelera aún más las consultas frecuentes. Aplicalo a las propiedades que más usas en filtros y ordenación: la diferencia es notable con datasets grandes.
👨💻 Dominar las consultas dinámicas transforma cómo estructuras tus apps SwiftUI. Permite interfaces reactivas sin sacrificar rendimiento ni claridad arquitectónica. ¿Ya las estás usando en producción?


Deja un comentario