Pular para o conteúdo
Skillpedia
Sites e telas (frontend)280 mil · #127

swiftui-patterns

Ajuda seu agente a criar interfaces de usuário modernas em Swift. Ele aplica padrões de arquitetura, gerencia o estado das telas e otimiza a performance.

O que ela faz

Este guia ensina as melhores práticas para criar aplicativos modernos para iPhone e Mac usando SwiftUI. Ele explica como organizar seu código, gerenciar dados e fazer a navegação funcionar de forma eficiente.

Quando usar

  • ✓Ao começar um novo aplicativo SwiftUI.
  • ✓Ao tentar organizar o código de um aplicativo existente.
  • ✓Quando o aplicativo está lento ou não responde bem.

Exemplo do que pedir para a IA

“Como posso organizar melhor meu código SwiftUI para gerenciar dados e navegação?”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/affaan-m/ECC/blob/main/pi/core/skills/swiftui-patterns/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/affaan-m/ECC/blob/main/pi/core/skills/swiftui-patterns/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

Ele mostra como usar ferramentas específicas do SwiftUI, como `@Observable` para gerenciar dados e `NavigationStack` para navegação. O objetivo é tornar o código mais limpo e o aplicativo mais rápido.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

npx skills add affaan-m/ECC --skill swiftui-patterns

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/swiftui-patterns/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

Padrões SwiftUI

Padrões modernos do SwiftUI para construir interfaces de usuário declarativas e de alto desempenho em plataformas Apple. Abrange o framework Observation, composição de views, navegação type-safe e otimização de desempenho.

Quando Ativar

  • Construindo views SwiftUI e gerenciando estado (@State, @Observable, @Binding)
  • Projetando fluxos de navegação com NavigationStack
  • Estruturando view models e fluxo de dados
  • Otimizando o desempenho de renderização para listas e layouts complexos
  • Trabalhando com valores de ambiente e injeção de dependência no SwiftUI

Gerenciamento de Estado

Seleção de Property Wrapper

Escolha o wrapper mais simples que se encaixa:

Wrapper Caso de Uso
@State Tipos de valor locais da view (toggles, campos de formulário, apresentação de sheets)
@Binding Referência bidirecional para @State do pai
@Observable class + @State Modelo próprio com múltiplas propriedades
@Observable class (sem wrapper) Referência somente leitura passada do pai
@Bindable Binding bidirecional para uma propriedade @Observable
@Environment Dependências compartilhadas injetadas via .environment()

ViewModel @Observable

Use @Observable (não ObservableObject) — ele rastreia mudanças em nível de propriedade para que o SwiftUI re-renderize apenas as views que leem a propriedade alterada:

@Observable
final class ItemListViewModel {
    private(set) var items: [Item] = []
    private(set) var isLoading = false
    var searchText = ""

    private let repository: any ItemRepository

    init(repository: any ItemRepository = DefaultItemRepository()) {
        self.repository = repository
    }

    func load() async {
        isLoading = true
        defer { isLoading = false }
        items = (try? await repository.fetchAll()) ?? []
    }
}

View Consumindo o ViewModel

struct ItemListView: View {
    @State private var viewModel: ItemListViewModel

    init(viewModel: ItemListViewModel = ItemListViewModel()) {
        _viewModel = State(initialValue: viewModel)
    }

    var body: some View {
        List(viewModel.items) { item in
            ItemRow(item: item)
        }
        .searchable(text: $viewModel.searchText)
        .overlay { if viewModel.isLoading { ProgressView() } }
        .task { await viewModel.load() }
    }
}

Injeção de Ambiente

Substitua @EnvironmentObject por @Environment:

// Inject
ContentView()
    .environment(authManager)

// Consume
struct ProfileView: View {
    @Environment(AuthManager.self) private var auth

    var body: some View {
        Text(auth.currentUser?.name ?? "Guest")
    }
}

Composição de Views

Extrair Subviews para Limitar Invalidação

Divida as views em structs pequenas e focadas. Quando o estado muda, apenas a subview que lê esse estado é re-renderizada:

struct OrderView: View {
    @State private var viewModel = OrderViewModel()

    var body: some View {
        VStack {
            OrderHeader(title: viewModel.title)
            OrderItemList(items: viewModel.items)
            OrderTotal(total: viewModel.total)
        }
    }
}

ViewModifier para Estilização Reutilizável

struct CardModifier: ViewModifier {
    func body(content: Content) -> some View {
        content
            .padding()
            .background(.regularMaterial)
            .clipShape(RoundedRectangle(cornerRadius: 12))
    }
}

extension View {
    func cardStyle() -> some View {
        modifier(CardModifier())
    }
}

Navegação

NavigationStack Type-Safe

Use NavigationStack com NavigationPath para roteamento programático e type-safe:

@Observable
final class Router {
    var path = NavigationPath()

    func navigate(to destination: Destination) {
        path.append(destination)
    }

    func popToRoot() {
        path = NavigationPath()
    }
}

enum Destination: Hashable {
    case detail(Item.ID)
    case settings
    case profile(User.ID)
}

struct RootView: View {
    @State private var router = Router()

    var body: some View {
        NavigationStack(path: $router.path) {
            HomeView()
                .navigationDestination(for: Destination.self) { dest in
                    switch dest {
                    case .detail(let id): ItemDetailView(itemID: id)
                    case .settings: SettingsView()
                    case .profile(let id): ProfileView(userID: id)
                    }
                }
        }
        .environment(router)
    }
}

Desempenho

…

Perguntas frequentes

Qual a diferença entre `@State` e `@Observable`?

`@State` é para dados simples que pertencem a uma única tela. `@Observable` é para dados mais complexos que podem ser compartilhados e gerenciados de forma mais eficiente, atualizando apenas as partes da tela que realmente precisam ser refeitas.

Como faço para que a navegação entre telas seja mais segura?

Use `NavigationStack` com `NavigationPath`. Isso permite que você defina claramente para onde pode ir e com quais dados, evitando erros comuns de navegação.

Por que meu aplicativo está lento?

Pode ser que partes desnecessárias da tela estejam sendo redesenhadas. Use `LazyVStack` para listas grandes e divida suas telas em componentes menores para que apenas o necessário seja atualizado.

Detalhes

Descrição original do autor

SwiftUI architecture patterns, state management with @Observable, view composition, navigation, performance optimization, and modern iOS/macOS UI best practices. Use when building or reviewing SwiftUI views, @Observable state, navigation, or render performance.

repo: affaan-m/ECC

Popularidade

Estrelas no GitHub
280 mil
Posição no ranking
#127
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas