¿Qué hace Experto en SwiftUI?
Reglas de Operación
- Trata cada tipo
Viewcomo un límite de invalidación: dale solo los datos que lee y mantén las dependencias que cambian con frecuencia cerca del subárbol afectado más pequeño. - Busca en
references/latest-apis.mdal escribir, revisar o migrar el uso de APIs; consulta solo las APIs relevantes para la tarea. - Reemplaza las APIs marcadas como obsoletas con equivalentes modernos. Durante el trabajo de funcionalidad, marca las APIs suavemente obsoletas (soft-deprecated) pero déjalas en su lugar (consulta
references/soft-deprecation.md). - Prefiere las APIs nativas de SwiftUI sobre el puente UIKit/AppKit a menos que el puente sea necesario.
- Enfócate en la corrección y el rendimiento; no impongas arquitecturas específicas (MVVM, VIPER, etc.).
- Fomenta la separación de la lógica de negocio de las vistas para facilitar las pruebas sin prescribir cómo hacerlo.
- Sigue las Guías de Interfaz Humana de Apple y los patrones de diseño de API.
- Adopta Liquid Glass solo cuando el usuario lo solicite explícitamente (consulta
references/liquid-glass.md). - Presenta las optimizaciones de rendimiento como sugerencias, no como requisitos.
- Usa el control
#availablecon alternativas sensibles para APIs específicas de versión. - Para entradas de diseño y renderizado, lee el valor más cercano a la vista SwiftUI que lo consume; no sustituyas el estado de pantalla global del proceso.
Flujo de Trabajo de Tareas
Revisar código SwiftUI existente
- Lee el código bajo revisión e identifica qué temas aplican.
- Señala APIs obsoletas (compáralas con
references/latest-apis.md); reemplaza las APIs duramente obsoletas (hard-deprecated) y marca las suavemente obsoletas (soft-deprecated) sin reescribirlas a menos que el usuario haya solicitado migrar. - Ejecuta el Enrutador de Temas a continuación para cada tema relevante.
- Valida el control
#availabley las rutas alternativas para características específicas de versión. - Para revisiones amplias de la base de código, primero identifica áreas de enfoque más pequeñas y preséntalas una a la vez; si el usuario solicita una revisión de toda la base de código, divídela en una lista de tareas pendientes.
Mejorar código SwiftUI existente
- Audita la implementación actual contra los temas del Enrutador de Temas.
- Reemplaza las APIs duramente obsoletas con equivalentes modernos de
references/latest-apis.md; marca las APIs suavemente obsoletas y no las reescribas durante el trabajo de funcionalidad. - Refactoriza las rutas críticas para reducir actualizaciones de estado innecesarias.
- Extrae cuerpos de vistas complejas en subvistas separadas.
- Sugiere reducir la resolución de imágenes cuando se encuentre
UIImage(data:)(optimización opcional, consultareferences/image-optimization.md).
Implementar nueva funcionalidad SwiftUI
- Diseña el flujo de datos primero: identifica el estado propio versus el inyectado.
- Estructura las vistas para un diffing óptimo (extrae subvistas temprano).
- Aplica patrones de animación correctos (implícita vs explícita, transiciones).
- Usa
Buttonpara todos los elementos tocables; agrega agrupación de accesibilidad y etiquetas. - Controla las APIs específicas de versión con
#availabley proporciona alternativas.
Grabar un nuevo trace de Instruments
Activa cuando el usuario pida "grabar un trace", "perfilar la app", "capturar una sesión", etc. Referencia completa: references/trace-recording.md.
- Confirmar destino — ¿adjuntar a una app en ejecución, lanzar una app o grabar todos los procesos? Si el usuario no lo dijo, pregunta. Lista los dispositivos conectados cuando sea útil:
python3 "${SKILL_DIR}/scripts/record_trace.py" --list-devices - Elegir una plantilla según el tipo de destino — la plantilla
SwiftUIllena el carril SwiftUI en cualquier dispositivo real: un dispositivo físico iOS/iPadOS o la Mac anfitriona. La única excepción es el Simulador de iOS, donde el carril SwiftUI está vacío — en ese caso, cambia a--template "Time Profiler"(proporciona Time Profiler + Hangs, pero no Animation Hitches). Siempre verifica--list-devices: tiposimulators→Time Profiler; tipodevices(dispositivos reales y la Mac anfitriona) → por defectoSwiftUI. Tabla de decisiones completa enreferences/trace-recording.md. - Iniciar la grabación. Para sesiones impulsadas por agente donde el usuario dice "Te avisaré cuando termine", inicia en segundo plano y usa un archivo de parada:
Para sesiones interactivas, solo dile al usuario que presione Ctrl+C cuando termine.python3 "${SKILL_DIR}/scripts/record_trace.py" \ --device "<nombre|udid>" --attach "<NombreApp>" \ --stop-file /tmp/stop-trace --output ~/Desktop/session.trace - Señalar parada — cuando el usuario diga que ha terminado de ejercitar la app, ejecuta
touch /tmp/stop-trace. El script limpia el SIGINT a xctrace y espera hasta 60s para la finalización. - Analizar el trace resultante (fluye al flujo de trabajo "Mejora basada en traces" a continuación).
Mejora basada en traces (se proporciona archivo .trace de Instruments)
Activa siempre que la solicitud del usuario haga referencia a un archivo .trace. Un archivo fuente SwiftUI de destino es opcional — si se da, cita líneas específicas; si no, recomienda dónde buscar según los nombres de vista y símbolos que el trace ya revela.
Referencia completa: references/trace-analysis.md.
Bloqueos: si xctrace help lista triage (Xcode 27.2 lo hace), comienza con xctrace triage <trace> --style hangs, luego profundiza con xctrace show. El analizador incluido sigue siendo la herramienta para tirones (hitches), actualizaciones de SwiftUI, gráfico de causas y ventanas de registro o signposts.
Resumen del patrón de composición del analizador:
- Delimitar el análisis. Pregúntate: ¿el usuario quiere todo el trace, o un segmento?
- "enfócate en X / después de X / entre X e Y / durante X" → resolver una ventana primero (ver paso 2).
- Sin pista de delimitación → analizar todo el trace.
- Resolver una ventana (solo si el usuario delimitó). El analizador expone dos modos de descubrimiento:
Ambos modos aceptan# Encontrar un registro que marque el inicio/fin de la región de interés: python3 "${SKILL_DIR}/scripts/analyze_trace.py" --trace <ruta> \ --list-logs --log-message-contains "feed cargado" --log-limit 5 # O listar intervalos de os_signpost (pares inicio/fin), filtrables por nombre: python3 "${SKILL_DIR}/scripts/analyze_trace.py" --trace <ruta> \ --list-signposts --signpost-name-contains "ImageDecode"--window START_MS:END_MSpara delimitar el descubrimiento. Elige eltime_ms(para logs) ostart_ms/end_ms(para signposts) que coincidan con la descripción del usuario. Construye una ventana como--window 10400:11700. - Ejecutar el análisis principal (con o sin
--window):python3 "${SKILL_DIR}/scripts/analyze_trace.py" --trace <ruta> \ --json-only --top 10 [--window START_MS:END_MS] - Interpretar con
references/trace-analysis.md— diagnósticos clave:main_running_coverage_pctdentro de cada correlación (<25% = bloqueado; ≥75% = ligado a CPU).swiftui-causes.top_sourcesrevela por qué ocurren las actualizaciones — fuentes de alto conteo de bordes comoUserDefaultObserver.send()o entradasEnvironmentWriteramplias son errores de invalidación estructural. Arreglar uno a menudo colapsa muchas vistas calientes aguas abajo.
- Cuando una vista específica se muestre como costosa, pregúntate quién la está invalidando. Usa
--fanin-for "<nombre de vista>"para obtener la lista clasificada de nodos fuente que impulsan las actualizaciones. - Opcionalmente, fundamenta en el código fuente. Si el usuario señaló un archivo, léelo y relaciona nombres de vista / símbolos de código de usuario con identificadores allí. Si no, recomienda qué archivos abrir basado en los nombres de vista que SwiftUI informó.
- Devolver un plan priorizado. Cita evidencia (% de cobertura, símbolo caliente, vista superpuesta, marca de tiempo de registro, bordes del gráfico de causa) y enruta cada recomendación a una referencia del Enrutador de Temas.
- Solo edita código si el usuario solicitó ediciones.
Enrutador de Temas
Consulta el archivo de referencia para cada tema relevante a la tarea actual:
| Tema | Referencia |
|---|---|
| Gestión de estado | references/state-management.md |
Entorno y @Entry, incluyendo advertencias sobre "Almacenar un tipo closure/clase en la clave '@Entry var'" | references/environment-patterns.md |
| Composición de vistas | references/view-structure.md |
| Modificadores de vista e identidad | references/modifier-patterns.md |
| Rendimiento | references/performance-patterns.md |
| Listas y ForEach | references/list-patterns.md |
| Diseño redimensionable, áreas seguras, reflujo de dos columnas, cuadrículas plegables, arreglos y regiones reservadas | references/layout-best-practices.md |
| iPhone Duo, pantallas plegables o de gran tamaño (lee primero para elegir la técnica) | references/iphone-duo.md |
Hojas, navegación, NavigationSplitView en pantallas grandes y barra de pestañas/barra lateral (sidebarAdaptable) | references/sheet-navigation-patterns.md |
| ScrollView, posición de desplazamiento y geometría de desplazamiento | references/scroll-patterns.md |
| Gestión de enfoque | references/focus-patterns.md |
| Animaciones (básicas) | references/animation-basics.md |
| Animaciones (transiciones) | references/animation-transitions.md |
| Animaciones (avanzadas) | references/animation-advanced.md |
| Accesibilidad | references/accessibility-patterns.md |
| Swift Charts | references/charts.md |
| Accesibilidad de gráficos | references/charts-accessibility.md |
| Optimización de imágenes y escala de visualización | references/image-optimization.md |
| Barras de herramientas | references/toolbar-patterns.md |
| Apps basadas en documentos | references/document-apps.md |
| WebKit | references/webkit-integration.md |
| Edición de texto estilizado | references/styled-text-editing.md |
| Liquid Glass (iOS 26+) | references/liquid-glass.md |
| Escenas de macOS | references/macos-scenes.md |
| Estilo de ventanas en macOS | references/macos-window-styling.md |
| Vistas de macOS | references/macos-views.md |
| Patrones de texto | references/text-patterns.md |
| Localización | references/localization.md |
| Consulta de APIs obsoletas | references/latest-apis.md |
| Manejo de APIs suavemente obsoletas | references/soft-deprecation.md |
| Vistas previas | references/previews.md |
| Análisis de traces de Instruments | references/trace-analysis.md |
| Grabación de traces de Instruments | references/trace-recording.md |
Lista de Verificación de Corrección
Estas son reglas estrictas — las violaciones siempre son errores:
- Las propiedades
@Statesonprivate -
@Bindingsolo cuando un hijo modifica el estado del padre - Las entradas propiedad del padre que cambian no se almacenan como
@State/@StateObject; las semillas de estado intencionales se documentan como únicas -
@StateObjectpara objetos propiedad de la vista;@ObservedObjectpara los inyectados - iOS 17+:
@Statecon@Observable;@Bindablepara observables inyectados que necesitan enlaces -
ForEachusa identidad estable (nunca.indices/\.offset; el id sobrevive a la vista y no se deriva de contenido mutable) - Número constante de vistas por elemento
ForEach; las filasListson unarias - No se almacenan closures en claves personalizadas de
@Environment/@FocusedValue - Los valores predeterminados de
@Entrypersonalizados son estables (sin expresionesModel()/Date()/UUID()) - La escala de visualización de SwiftUI proviene de
@Environment(\.displayScale), no del estado global de pantalla - El contenido de áreas seguras no aplica dos veces
GeometryProxy.safeAreaInsets -
.animation(_:value:)siempre incluye el parámetrovalue - Las propiedades
@FocusStatesonprivate - No hay escrituras redundantes de
@FocusStatedentro de gestores de toque en vistas.focusable() - Las APIs específicas de versión están controladas con
#availabley tienen alternativas sensibles -
import Chartspresente en archivos que usan tipos de gráficos - Las vistas previas usan datos simulados autocontenidos; sin dependencia de servicios en vivo o red