一键导入
view
Cria uma nova View SwiftUI seguindo o padrao MVVM do projeto (iOS 15+). Use quando o usuario pedir para criar uma nova tela, view ou screen.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Cria uma nova View SwiftUI seguindo o padrao MVVM do projeto (iOS 15+). Use quando o usuario pedir para criar uma nova tela, view ou screen.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Cria um novo ViewModel SwiftUI seguindo o padrao MVVM do projeto (iOS 15+). Use quando o usuario pedir para criar um novo ViewModel.
Implementa animacoes SwiftUI seguindo as melhores praticas de performance e corretude. Use quando o usuario pedir para animar views, criar transicoes, usar phaseAnimator, keyframeAnimator, ou matchedGeometryEffect.
Implementa efeitos Liquid Glass (iOS 26+) com fallbacks corretos para versoes anteriores. Use APENAS quando o usuario pedir explicitamente para adotar Liquid Glass, glass effects, glassEffect modifier, ou o novo visual design do iOS 26.
Implementa funcionalidades específicas de macOS em apps SwiftUI — Scenes (Settings, MenuBarExtra, WindowGroup, Window, UtilityWindow, DocumentGroup), estilos de janela e toolbar, NavigationSplitView, Inspector, Commands, HSplitView, Table, operações de arquivo, drag-drop entre apps, e interop AppKit. Use quando o usuário precisar de qualquer API exclusiva ou com comportamento diferenciado no macOS.
Cria uma nova Model (struct) seguindo os padroes MVVM do projeto SwiftUI. Use quando o usuario pedir para criar um novo modelo, entidade ou struct de dados.
Configura a navegacao SwiftUI seguindo o padrao MVVM do projeto (iOS 15+). Use quando o usuario pedir para criar o AppRouter, adicionar rotas, configurar NavigationView, ou implementar navegacao programatica.
| name | view |
| description | Cria uma nova View SwiftUI seguindo o padrao MVVM do projeto (iOS 15+). Use quando o usuario pedir para criar uma nova tela, view ou screen. |
Crie uma nova View SwiftUI seguindo o padrao MVVM do projeto. Target minimo: iOS 15.
Nome da View em PascalCase: $ARGUMENTS
Se $ARGUMENTS estiver vazio, pergunte: "Qual o nome da View? (ex: ProductDetail, Profile)"
A partir do nome PascalCase, derive:
<Name>View para o nome da struct da View<Name>ViewModel para o nome da classe do ViewModelViews/<Name>/UserRepository) — se nao souber, use um placeholderNavigationView? (padrao: sim). Se nao, omita o wrapper NavigationView, .navigationViewStyle(.stack) e o .navigationTitle.Views/<Name>/<Name>View.swiftPara suportar previews com estados diferentes, use o init com StateObject injetavel:
import SwiftUI
struct <Name>View: View {
@StateObject private var viewModel: <Name>ViewModel
init(viewModel: <Name>ViewModel = <Name>ViewModel()) {
_viewModel = StateObject(wrappedValue: viewModel)
}
var body: some View {
NavigationView {
Group {
switch viewModel.state {
case .idle:
EmptyView()
case .loading:
ProgressView("Carregando...")
case .success(let data):
content(data)
case .error(let message):
ErrorStateView(message: message) {
Task { await viewModel.load() }
}
}
}
.navigationTitle("<Name>")
}
.navigationViewStyle(.stack)
.task {
await viewModel.load()
}
}
// MARK: - Subviews
private func content(_ data: <DataType>) -> some View {
ScrollView {
VStack(spacing: 16) {
// TODO: Adicione o conteudo aqui
}
.padding()
}
}
}
// MARK: - Preview
#Preview {
<Name>View()
}
#Preview("Loading") {
<Name>View(viewModel: <Name>ViewModel(repository: Mock<Repository>(state: .loading)))
}
#Preview("Error") {
<Name>View(viewModel: <Name>ViewModel(repository: Mock<Repository>(state: .failure)))
}
ViewModels/<Name>ViewModel.swift (se solicitado)Para padrões completos de ViewModel (busca, paginação, múltiplos estados), use a skill
view-model.
import Foundation
@MainActor
final class <Name>ViewModel: ObservableObject {
// MARK: - State
@Published private(set) var state: ViewState<<DataType>> = .idle
// MARK: - Dependencies
private let repository: <Repository>Protocol
// MARK: - Init
init(repository: <Repository>Protocol = <Repository>()) {
self.repository = repository
}
// MARK: - Actions
func load() async {
state = .loading
do {
let data = try await repository.fetch()
state = .success(data)
} catch {
state = .error(error.localizedDescription)
}
}
}
Views/<Name>/Components/ (diretorio)Crie o diretorio para componentes futuros da View. Nao crie arquivos dentro dele, apenas informe o usuario que subcomponentes devem ser colocados aqui.
Informe o usuario que ainda precisa:
Utilities/ViewState.swift existe no projeto — se nao, crie-oViews/Shared/ErrorStateView.swift existe no projeto — se nao, crie o arquivo com o codigo abaixo:import SwiftUI
struct ErrorStateView: View {
let message: String
let retryAction: () -> Void
var body: some View {
VStack(spacing: 16) {
Image(systemName: "exclamationmark.triangle")
.font(.system(size: 48))
.foregroundColor(.secondary)
Text(message)
.font(.body)
.multilineTextAlignment(.center)
.foregroundColor(.secondary)
Button(action: retryAction) {
Text("Tentar novamente")
.fontWeight(.medium)
}
.buttonStyle(.bordered)
}
.padding()
}
}
Repositories/ (se ainda nao existir), seguindo o padrao Protocol + implementacao concretaAppRouter se estiver usando navegacao centralizadaView — nunca classes@State para estado local da View (toggle, campo de texto)@StateObject para criar o ViewModel, @ObservedObject para receber de fora.task {} para chamadas async ao aparecer a Viewswitch sobre o ViewState para reagir a cada estadoNavigationView + .navigationViewStyle(.stack) — nunca NavigationStack (requer iOS 16)NavigationLink(destination:) — nunca NavigationLink(value:) (requer iOS 16)#Preview funcionalFoundation e CombineObservableObject — nunca @Observable (requer iOS 17)@MainActorViewState<T> para gerenciar estado — nunca booleans avulsos@Published private(set)init (para testabilidade)| Tipo | Convencao | Exemplo |
|---|---|---|
| View | PascalCase + sufixo View | ProductDetailView |
| ViewModel | PascalCase + sufixo ViewModel | ProductDetailViewModel |
| Componente | PascalCase + sufixo View | ProductCardView |
| Diretorio | PascalCase (nome da feature) | Views/ProductDetail/ |
| NAO usar | Requer | Usar no lugar |
|---|---|---|
@Observable | iOS 17 | ObservableObject + @Published |
@State com class | iOS 17 | @StateObject |
@Bindable | iOS 17 | @ObservedObject |
NavigationStack | iOS 16 | NavigationView + .navigationViewStyle(.stack) |
NavigationLink(value:) | iOS 16 | NavigationLink(destination:) |
navigationDestination(for:) | iOS 16 | Remover |
ContentUnavailableView | iOS 17 | ErrorStateView customizada |
.environment() com Observable | iOS 17 | @EnvironmentObject |
async/await para concorrencia — prefira sobre Combine para novas featuresView (nunca class)body@StateObject com init injetavel para suportar previewsswitch exaustivo sobre ViewState (todos os 4 casos tratados).task {} usado para carregamento async (nao onAppear)NavigationView + .navigationViewStyle(.stack) (nunca NavigationStack)NavigationLink(destination:) (nunca NavigationLink(value:))ErrorStateView presente em Views/Shared/ViewState.swift presente em Utilities/#Preview funcional com pelo menos estado de sucessoComponents/ criado para subcomponentes futuros