CommunityProgramación y desarrollogithub.com

dimillian/swiftui-view-refactor

Refactoriza y revisa archivos de vista SwiftUI con estándares sólidos para subvistas pequeñas y dedicadas, flujo de datos MV sobre MVVM, árboles de vista estables, inyección de dependencias explícita y uso correcto de Observation. Útil al limpiar una vista SwiftUI, dividir cuerpos largos, eliminar acciones o efectos secundarios en línea, reducir ayudantes computados de `some View`, o estandarizar `@Observable` y patrones de inicialización de modelos de vista.

¿Qué es swiftui-view-refactor?

Esta habilidad está diseñada para desarrolladores de iOS/macOS que trabajan con SwiftUI y desean mantener una arquitectura limpia, escalable y predecible en sus vistas. Se enfoca en refactorizar archivos de vista siguiendo principios como el uso de subvistas pequeñas y dedicadas, el patrón MV (Model-View) en lugar de MVVM (Model-View-ViewModel) para evitar la sobreingeniería, árboles de vista estables para minimizar recreaciones innecesarias, y la inyección explícita de dependencias para mejorar la testabilidad. Además, garantiza el uso correcto de `@Observable` y la inicialización de modelos de vista. Es compatible con cualquier editor o entorno que admita agentes de IA para Swift (como Claude Code, Cursor, etc.). La habilidad analiza el código de la vista, sugiere divisiones en subvistas, elimina acciones y efectos secundarios en línea, reduce la cantidad de propiedades computadas `some View`, y estandariza el uso del macro `@Observable` y la inicialización de `@State` y `@Environment`. Esto resulta en un código más mantenible, con mejor rendimiento y más fácil de probar.

Compatible con~Claude Code~Codex CLI~Cursor
Part ofMobile
npx skills add https://github.com/dimillian/skills/tree/main/skills/swiftui-view-refactor

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 swiftui-view-refactor?

Refactoriza y revisa archivos de vista SwiftUI con estándares sólidos para subvistas pequeñas y dedicadas, flujo de datos MV sobre MVVM, árboles de vista estables, inyección de dependencias explícita y uso correcto de Observation. Útil al limpiar una vista SwiftUI, dividir cuerpos largos, eliminar acciones o efectos secundarios en línea, reducir ayudantes computados de some View, o estandarizar @Observable y patrones de inicialización de modelos de vista.

Principios

  • Subvistas pequeñas y dedicadas: Cada vista debe tener una sola responsabilidad. Divide las vistas grandes en subvistas más pequeñas que manejen una parte específica de la UI.
  • MV sobre MVVM: Prefiere el patrón Model-View (MV) sobre Model-View-ViewModel (MVVM) para evitar la sobreingeniería y mantener el flujo de datos simple. Los modelos pueden ser observables directamente usando @Observable.
  • Árboles de vista estables: Minimiza las recreaciones de vistas usando identificadores estables y evitando cambios innecesarios en la estructura del árbol de vistas.
  • Inyección de dependencias explícita: Pasa las dependencias de manera explícita a las vistas a través de inicializadores o propiedades, en lugar de usar Singletons o variables globales.
  • Uso correcto de Observation: Utiliza el macro @Observable para modelos y @Bindable para enlaces bidireccionales, asegurando que las vistas se actualicen correctamente cuando cambien los datos.

Cuándo usar

  • Al limpiar una vista SwiftUI que se ha vuelto larga o compleja.
  • Cuando necesitas dividir el cuerpo de una vista en subvistas más manejables.
  • Para eliminar acciones o efectos secundarios que están definidos en línea dentro del cuerpo de la vista.
  • Al reducir el número de propiedades computadas some View que pueden afectar el rendimiento.
  • Para estandarizar el uso de @Observable y los patrones de inicialización de modelos de vista en todo el proyecto.

Ejemplo de refactorización

Antes:

struct ContentView: View {
    @State private var items: [Item] = []
    @State private var isLoading = false
    
    var body: some View {
        List {
            if isLoading {
                ProgressView()
            } else {
                ForEach(items) { item in
                    HStack {
                        Text(item.name)
                        Spacer()
                        Button("Eliminar") {
                            deleteItem(item)
                        }
                    }
                }
            }
        }
        .onAppear {
            loadItems()
        }
    }
    
    private func loadItems() {
        // carga elementos
    }
    
    private func deleteItem(_ item: Item) {
        // elimina elemento
    }
}

Después:

struct ContentView: View {
    @State private var viewModel = ContentViewModel()
    
    var body: some View {
        List {
            if viewModel.isLoading {
                LoadingView()
            } else {
                ItemsListView(items: viewModel.items, onDelete: viewModel.deleteItem)
            }
        }
        .task {
            await viewModel.loadItems()
        }
    }
}

@Observable
final class ContentViewModel {
    var items: [Item] = []
    var isLoading = false
    
    func loadItems() async {
        isLoading = true
        // carga elementos de forma asíncrona
        isLoading = false
    }
    
    func deleteItem(_ item: Item) {
        items.removeAll { $0.id == item.id }
    }
}

struct LoadingView: View {
    var body: some View {
        ProgressView()
            .frame(maxWidth: .infinity, maxHeight: .infinity)
    }
}

struct ItemsListView: View {
    let items: [Item]
    let onDelete: (Item) -> Void
    
    var body: some View {
        ForEach(items) { item in
            ItemRowView(item: item, onDelete: onDelete)
        }
    }
}

struct ItemRowView: View {
    let item: Item
    let onDelete: (Item) -> Void
    
    var body: some View {
        HStack {
            Text(item.name)
            Spacer()
            Button("Eliminar") {
                onDelete(item)
            }
        }
    }
}

Notas

  • Asegúrate de que todas las dependencias sean inyectadas explícitamente en las vistas o modelos de vista.
  • Usa @Environment para valores proporcionados por el entorno de SwiftUI, como dismiss o openURL.
  • Evita el uso de @StateObject y @ObservedObject a favor de @State con @Observable.
  • Si necesitas que una vista modifique el estado de un modelo observable, usa @Bindable para crear un enlace.

Individual skills in this repo

This repo contains 7 individual skills — each has its own dedicated page.

dimillian/app-store-changelog

Create user-facing App Store release notes by collecting and summarizing all user-impacting changes since the last git tag (or a specified ref). Use when asked to generate a comprehensive release changelog, App Store "What's New" text, or release notes based on git history or tags.

dimillian/ios-debugger-agent

Use XcodeBuildMCP to build, run, launch, and debug the current iOS project on a booted simulator. Trigger when asked to run an iOS app, interact with the simulator UI, inspect on-screen state, capture logs/console output, or diagnose runtime behavior using XcodeBuildMCP tools.

dimillian/macos-spm-app-packaging

Scaffold, build, and package SwiftPM-based macOS apps without an Xcode project. Use when you need a from-scratch macOS app layout, SwiftPM targets/resources, a custom .app bundle assembly script, or signing/notarization/appcast steps outside Xcode.

dimillian/swift-concurrency-expert

Swift Concurrency review and remediation for Swift 6.2+. Use when asked to review Swift Concurrency usage, improve concurrency compliance, or fix Swift concurrency compiler errors in a feature or file. Concrete actions include adding Sendable conformance, applying @MainActor annotations, resolving actor isolation warnings, fixing data race diagnostics, and migrating completion handlers to async/await.

dimillian/swiftui-liquid-glass

Implement, review, or improve SwiftUI features using the iOS 26+ Liquid Glass API. Use when asked to adopt Liquid Glass in new SwiftUI UI, refactor an existing feature to Liquid Glass, or review Liquid Glass usage for correctness, performance, and design alignment.

dimillian/swiftui-performance-audit

Audit and improve SwiftUI runtime performance from code review and architecture. Use for requests to diagnose slow rendering, janky scrolling, high CPU/memory usage, excessive view updates, or layout thrash in SwiftUI apps, and to provide guidance for user-run Instruments profiling when code review alone is insufficient.

dimillian/swiftui-ui-patterns

Best practices and example-driven guidance for building SwiftUI views and components, including navigation hierarchies, custom view modifiers, and responsive layouts with stacks and grids. Use when creating or refactoring SwiftUI UI, designing tab architecture with TabView, composing screens with VStack/HStack, managing @State or @Binding, building declarative iOS interfaces, or needing component-specific patterns and examples.

Skills relacionados