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
Mensagem pronta para colar
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-patternsOu baixe só o arquivo:
curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/swiftui-patterns/SKILL.md -o SKILL.mdConteú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
Comentários
- …
Mais skills deste repositório
accessibility
Ajuda seu agente a criar interfaces que todos possam usar. Garante que sites e aplicativos funcionem bem para pessoas com deficiência, como cegos ou com mobilidade reduzida.
affaan-m/ECC
agent-architecture-audit
Faz seu agente verificar se tudo está funcionando corretamente. Ele encontra e conserta problemas em sistemas de IA, garantindo que funcionem como esperado.
affaan-m/ECC
agent-eval
Ajuda seu agente a comparar diferentes ferramentas de programação de IA. Ele mede qual é mais rápido, barato e confiável para realizar tarefas específicas.
affaan-m/ECC
agent-harness-construction
Faz seu agente entender melhor como realizar tarefas. Ele otimiza as ferramentas e instruções que o agente usa para aumentar suas chances de sucesso.
affaan-m/ECC
Skills parecidas
web-artifacts-builder
Ajuda seu agente a construir artefatos HTML complexos com tecnologias modernas. Ideal para interfaces com gerenciamento de estado e componentes avançados.
anthropics/skills
frontend-ui-engineering
Ajuda seu agente a criar interfaces de usuário bonitas e fáceis de usar. Faz com que o resultado pareça profissional e funcione bem em diferentes dispositivos.
addyosmani/agent-skills
export-nextjs-handoff
Faz seu agente transformar designs em código Next.js. Ele cria componentes, estilos e notas para facilitar o trabalho do desenvolvedor.
nexu-io/open-design