CommunityProgramación y desarrollogithub.com

Experto en SwiftUI

Úsalo al escribir, revisar o refactorizar código SwiftUI para iOS o macOS, incluyendo flujo de datos con estado y `@Observable`, composición de vistas, diseños redimensionables, áreas seguras, escala de visualización, rendimiento, listas, entorno, localización, animación, Liquid Glass y migración de API. También para diseños de iPhone Duo, plegables o pantallas grandes (`NavigationSplitView` en pantallas grandes, barra lateral en iPhone, reflujo de dos columnas, cuadrículas plegables, `ArrangementView`, `ReservedRegion`), efectos de bisagra, barras verticales, diagnóstico de inicialización de `@State` o propiedades sintetizadas, ambigüedad de `@ContentBuilder`, arrastrar/soltar `reordenable`, `AsyncImage` personalizado con `URLSession`, acciones de deslizamiento fuera de List, `alert`/`confirmationDialog` vinculados a ítems, `ToolbarOverflowMenu`, `AnimatableValues`, APIs de Documento (`Document`/`DocumentReader`) y captura o análisis de `.trace` de Instruments.

¿Qué es Experto en SwiftUI?

Este skill, 'Experto en SwiftUI', está diseñado para desarrolladores que trabajan con SwiftUI en iOS y macOS. Proporciona pautas y referencias detalladas para escribir, revisar y refactorizar código SwiftUI, cubriendo temas como gestión de estado, composición de vistas, rendimiento, animaciones, diseño adaptativo para múltiples dispositivos (incluyendo iPhone Duo, plegables y pantallas grandes), y migración de APIs. El skill también incluye flujos de trabajo para la revisión de código, mejora de código existente, implementación de nuevas funcionalidades, y análisis de rendimiento usando traces de Instruments. Utiliza un enrutador de temas que dirige a archivos de referencia específicos para cada tarea, y una lista de verificación de corrección con reglas estrictas para evitar errores comunes. El skill está diseñado para usarse con herramientas de IA como Claude Code, Cursor o Codex, proporcionando instrucciones claras y ejemplos de comandos para automatizar tareas como la grabación y análisis de traces. Su enfoque está en la corrección y el rendimiento, sin imponer arquitecturas específicas, y fomenta la separación de la lógica de negocio de las vistas para mejorar la testabilidad.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/erumkatzwan/agentic-product-starter/tree/HEAD/apps/ios/.agents/skills/swiftui-expert

Installed? Explore more Programación y desarrollo skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

¿Qué hace Experto en SwiftUI?

Reglas de Operación

  • Trata cada tipo View como 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.md al 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 #available con 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 #available y 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, consulta references/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 Button para todos los elementos tocables; agrega agrupación de accesibilidad y etiquetas.
  • Controla las APIs específicas de versión con #available y 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.

  1. 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
    
  2. Elegir una plantilla según el tipo de destino — la plantilla SwiftUI llena 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: tipo simulators → Time Profiler; tipo devices (dispositivos reales y la Mac anfitriona) → por defecto SwiftUI. Tabla de decisiones completa en references/trace-recording.md.
  3. 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:
    python3 "${SKILL_DIR}/scripts/record_trace.py" \
        --device "<nombre|udid>" --attach "<NombreApp>" \
        --stop-file /tmp/stop-trace --output ~/Desktop/session.trace
    
    Para sesiones interactivas, solo dile al usuario que presione Ctrl+C cuando termine.
  4. 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.
  5. 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:

  1. 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.
  2. Resolver una ventana (solo si el usuario delimitó). El analizador expone dos modos de descubrimiento:
    # 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"
    
    Ambos modos aceptan --window START_MS:END_MS para delimitar el descubrimiento. Elige el time_ms (para logs) o start_ms/end_ms (para signposts) que coincidan con la descripción del usuario. Construye una ventana como --window 10400:11700.
  3. 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]
    
  4. Interpretar con references/trace-analysis.md — diagnósticos clave:
    • main_running_coverage_pct dentro de cada correlación (<25% = bloqueado; ≥75% = ligado a CPU).
    • swiftui-causes.top_sources revela por qué ocurren las actualizaciones — fuentes de alto conteo de bordes como UserDefaultObserver.send() o entradas EnvironmentWriter amplias son errores de invalidación estructural. Arreglar uno a menudo colapsa muchas vistas calientes aguas abajo.
  5. 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.
  6. 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ó.
  7. 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.
  8. 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:

TemaReferencia
Gestión de estadoreferences/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 vistasreferences/view-structure.md
Modificadores de vista e identidadreferences/modifier-patterns.md
Rendimientoreferences/performance-patterns.md
Listas y ForEachreferences/list-patterns.md
Diseño redimensionable, áreas seguras, reflujo de dos columnas, cuadrículas plegables, arreglos y regiones reservadasreferences/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 desplazamientoreferences/scroll-patterns.md
Gestión de enfoquereferences/focus-patterns.md
Animaciones (básicas)references/animation-basics.md
Animaciones (transiciones)references/animation-transitions.md
Animaciones (avanzadas)references/animation-advanced.md
Accesibilidadreferences/accessibility-patterns.md
Swift Chartsreferences/charts.md
Accesibilidad de gráficosreferences/charts-accessibility.md
Optimización de imágenes y escala de visualizaciónreferences/image-optimization.md
Barras de herramientasreferences/toolbar-patterns.md
Apps basadas en documentosreferences/document-apps.md
WebKitreferences/webkit-integration.md
Edición de texto estilizadoreferences/styled-text-editing.md
Liquid Glass (iOS 26+)references/liquid-glass.md
Escenas de macOSreferences/macos-scenes.md
Estilo de ventanas en macOSreferences/macos-window-styling.md
Vistas de macOSreferences/macos-views.md
Patrones de textoreferences/text-patterns.md
Localizaciónreferences/localization.md
Consulta de APIs obsoletasreferences/latest-apis.md
Manejo de APIs suavemente obsoletasreferences/soft-deprecation.md
Vistas previasreferences/previews.md
Análisis de traces de Instrumentsreferences/trace-analysis.md
Grabación de traces de Instrumentsreferences/trace-recording.md

Lista de Verificación de Corrección

Estas son reglas estrictas — las violaciones siempre son errores:

  • Las propiedades @State son private
  • @Binding solo 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
  • @StateObject para objetos propiedad de la vista; @ObservedObject para los inyectados
  • iOS 17+: @State con @Observable; @Bindable para observables inyectados que necesitan enlaces
  • ForEach usa 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 filas List son unarias
  • No se almacenan closures en claves personalizadas de @Environment/@FocusedValue
  • Los valores predeterminados de @Entry personalizados son estables (sin expresiones Model()/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ámetro value
  • Las propiedades @FocusState son private
  • No hay escrituras redundantes de @FocusState dentro de gestores de toque en vistas .focusable()
  • Las APIs específicas de versión están controladas con #available y tienen alternativas sensibles
  • import Charts presente en archivos que usan tipos de gráficos
  • Las vistas previas usan datos simulados autocontenidos; sin dependencia de servicios en vivo o red

Skills relacionados