К основному содержанию
скилл CX Codex

swiftui-development — скилл для Claude Code: правила SwiftUI и Swift 6

Набор правил для ИИ-агента: как строить SwiftUI-приложения на MVVM, управлять состоянием и работать с конкурентностью Swift 6.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add Mindrally/skills --skill swiftui-development -a claude-code
Открыть на GitHub

Что делает swiftui-development

Скилл задаёт агенту рамки при написании SwiftUI-кода. Архитектура — MVVM или Clean Architecture, для сложной навигации добавляется слой Coordinator. Состояние разводится по назначению: @State для локальных значений, @Binding для связи с дочерними вью, @Observable вместо ObservableObject и @Published в новых моделях на iOS 17+. Вью держат маленькими, а body длиннее 50 строк предлагается разбивать на подвью.

Отдельный блок про Swift 6: строгие проверки конкурентности включены, предупреждения считаются ошибками. Модели вью помечаются @MainActor, асинхронная работа стартует через .task(id:), а не .onAppear, чтобы задача отменялась при уходе вью. Общая изменяемая логика уходит в actor. Целевые версии — Swift 6.0+ и iOS 17+, где это возможно; если минимальная версия вынуждает старые паттерны, агент это отметит.

Есть разделы про лейаут, анимации, память и доступность. GeometryReader советуют использовать скупо, идентификаторы элементов списка брать из Identifiable, а не \.self, для тяжёлых вычислений — профилировать в Instruments, а не гадать. Замыкания, живущие дольше текущей области видимости, по умолчанию берут [weak self]. Скилл рассчитан на проект, который уже собирается под Swift 6 — на старом коде с мягкими проверками конкурентности часть советов придётся отложить.

Какие задачи решает

  • разложить экран на вью и модель по MVVM
  • выбрать между @State, @Binding и @Observable
  • перевести модель вью на @MainActor без гонок
  • заменить .onAppear на .task(id:) для асинхронной загрузки
  • разбить разросшийся body на подвью

Примеры запросов агенту

  • Собери экран списка заказов на SwiftUI с моделью вью по MVVM
  • Перепиши эту модель вью под Swift 6 со строгой проверкой конкурентности
  • Почему здесь перерисовывается весь список? Проверь по правилам скилла

Как установить swiftui-development

1Через Skills CLI (Vercel)

npx skills add Mindrally/skills --skill swiftui-development -a claude-code

2Вручную: положить файлы

~/.claude/skills/swiftui-development/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/swiftui-development/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о swiftui-development

Как установить swiftui-development в Claude?

Через установщик скиллов: npx skills add Mindrally/skills --skill swiftui-development -a claude-code. После этого файл скилла лежит в ~/.claude/skills/swiftui-development/SKILL.md.

Что делает swiftui-development?

Даёт агенту правила написания SwiftUI-кода: архитектура MVVM или Clean Architecture, современное управление состоянием, конкурентность Swift 6, лейаут, анимации и работа с памятью.

Какие версии Swift и iOS нужны?

Скилл нацелен на Swift 6.0+ со строгой проверкой конкурентности и на iOS 17+, где доступны @Observable, NavigationStack и #Preview.

Исходный текст

SKILL.md · Apache-2.0
---
name: swiftui-development
description: "Guidelines for building SwiftUI applications with MVVM/Clean Architecture, Swift 6 strict concurrency, and modern state management. Use when building SwiftUI views, structuring view models, managing state with @State/@Observable, handling async data flow, or optimizing SwiftUI view performance."
metadata:
  maintainer: Mindrally
  source: https://github.com/Mindrally/skills
---

# SwiftUI Development

This skill covers best practices for building clear, performant, and maintainable SwiftUI applications, including architecture, state management, Swift 6 concurrency, layout, animation, and testing.

## Key Principles

- Write correct, up-to-date, bug-free, fully functional, secure, and performant code
- Favor readability, but not at the expense of correctness or safety
- Fully implement all requested functionality — leave no TODOs, placeholders, or missing pieces
- Target Swift 6.0+ with strict concurrency checking enabled; treat concurrency warnings as errors
- Target iOS 17+ where possible to use modern APIs (`@Observable`, `NavigationStack`, `#Preview`); note the minimum deployment target when it forces older patterns

## Architecture

- Use MVVM (Model-View-ViewModel) or Clean Architecture; introduce a Coordinator layer for complex, multi-screen navigation flows
- Apply SOLID principles to views and view models:
  - **Single Responsibility** — each view or view model has one reason to change
  - **Open/Closed** — extend behavior via composition and protocols rather than modifying existing types
  - **Liskov Substitution** — protocol conformances must be substitutable without surprising callers
  - **Interface Segregation** — keep protocols small and focused rather than one large "do everything" interface
  - **Dependency Inversion** — depend on protocol abstractions, not concrete types, and inject dependencies via `init`
- Implement protocol-oriented programming; prefer structs over classes for data models
- Use extensions for code organization and separation of concerns

## SwiftUI View Structure

- Keep views small and focused on a single responsibility
- Treat 50 lines as a practical ceiling for a `body` property — past that, extract subviews into small, reusable structs or private extension functions
- Use `@ViewBuilder` for custom container views and complex conditional view logic
- Implement proper view composition patterns

## State Management

- `@State` — local, value-type view state (Bool, Int, String, small structs)
- `@Binding` — two-way data binding with child views
- `@StateObject` — use only in the view that creates/owns the object's lifecycle
- `@ObservedObject` — use in child views that react to changes but don't own the object
- `@EnvironmentObject` / `@Environment` — use sparingly for broadly shared dependencies or system values; prefer explicit dependency injection via `init` when a dependency belongs to a specific view hierarchy rather than the whole app
- `@Published` — for observable properties on `ObservableObject` classes (pre-iOS 17 or when `ObservableObject` is otherwise required)
- `@Observable` macro (iOS 17+) — prefer this over `ObservableObject`/`@Published` for new view models; it removes the need for `@Published` on every property and only triggers view updates for properties actually read by that view, which reduces unnecessary redraws

## Naming Conventions

- camelCase for variables, functions, and methods; PascalCase for types (classes, structs, enums, protocols)
- Use descriptive, verbose names — `fetchUserData` over `getData`
- Prefix boolean variables with `is`, `has`, `should`, etc.
- Use verb phrases for function names

## SwiftUI Best Practices

- Use SF Symbols for system icons; use semantic colors from the asset catalog for automatic dark mode support
- Support Dynamic Type and implement proper keyboard avoidance
- Use `NavigationStack` (iOS 16+) over the deprecated `NavigationView`
- Prefer type-inferred shorthand dot syntax where available (e.g., `.background(.blue)`)
- Add `.contentShape(Rectangle())` to `HStack`/`VStack` rows that have transparent backgrounds, so taps register across the whole row rather than only on opaque content

## Layout and Styling

- Use native SwiftUI layout containers (VStack, HStack, ZStack, Grid); use `LazyVStack`/`LazyHStack` for dynamic or long lists
- Use `GeometryReader` sparingly — it expands to fill all available space and can hurt layout performance; prefer `.background(GeometryReader { ... })` scoped to a single view, or the `Layout` protocol for custom layouts
- Give list items stable, meaningful `id`s (from `Identifiable`) rather than `\.self`
- Implement adaptive layouts for different screen sizes
- Use `ViewModifier`s for reusable styling; create custom `ButtonStyle`, `TextFieldStyle`, etc.

## Animations and Transitions

- Prefer `.animation(_:value:)` scoped to a specific state value over broad `withAnimation` calls, especially inside `body`
- Reserve `withAnimation` for animations explicitly triggered by user interaction
- Implement custom transitions using `AnyTransition`; use `matchedGeometryEffect` for hero animations
- Use `TimelineView` for high-frequency, time-driven visual updates instead of a `Timer` + published property

## Swift 6 Concurrency & Data Flow

- Annotate view models with `@MainActor`; all UI updates must happen on the main actor
- Prefer `.task(id:)` over `.onAppear` for starting async work — it automatically cancels the task when the view disappears or the id changes, avoiding orphaned work
- Use `async`/`await` for asynchronous operations and `Result` (or typed throws) for error handling
- Prefer `actor` types for shared mutable state or services accessed from multiple tasks
- Mark pure logic functions `nonisolated` when they don't touch the main actor, to avoid unnecessary hops
- Never block the main thread — move heavy computation to a detached `Task`
- Handle loading, error, and success states explicitly rather than leaving implicit/undefined states

## Memory Management & Safety

- Default to `[weak self]` in closures that outlive the current scope; use `guard let self else { return }` at the start of async closures
- Only use `[unowned self]` when the closure's lifetime is provably shorter than `self`'s
- Handle optionals safely — no force unwrapping; use `guard` for early returns
- For remote images, use `AsyncImage` (with a caching layer, or a library like Nuke/Kingfisher for production apps) and apply `.resizable()` immediately

## Performance Optimization

- Minimize view body recalculations; adopt `Equatable` conformance where it helps SwiftUI skip redundant diffing
- Implement proper list diffing with `Identifiable` items and stable ids
- Profile with Instruments before optimizing; cache expensive computations rather than recomputing them in `body`

## Accessibility

- Add accessibility labels, hints, and traits appropriately; support VoiceOver
- Assign distinct `accessibilityIdentifier` strings to interactive elements so UI tests can target them reliably
- Test with accessibility features (Dynamic Type, VoiceOver, Reduce Motion) enabled

## Testing and Previews

- Always provide a preview using `#Preview` (Xcode 15+) or `PreviewProvider` on older toolchains, injecting realistic mock data
- Preview in multiple color schemes and device sizes
- Structure unit tests with Given-When-Then; generate protocol-based mocks for external dependencies so view models can be tested without hitting real services

## Code Quality

- Write self-documenting code; add comments only for non-obvious logic
- Follow the Swift API Design Guidelines
- Use `MARK: - Section Name` to organize longer files, and place private helpers in a `private extension`

## Common Patterns

### View with @Observable ViewModel (iOS 17+)
```swift
@Observable
@MainActor
final class ContentViewModel {
    var items: [Item] = []
    var isLoading = false

    func loadItems() async {
        isLoading = true
        defer { isLoading = false }
        // Load items
    }
}

struct ContentView: View {
    @State private var viewModel = ContentViewModel()

    var body: some View {
        List(viewModel.items) { item in
            Text(item.name)
        }
        .task(id: viewModel.items.count) {
            await viewModel.loadItems()
        }
    }
}
```

### View with ObservableObject ViewModel (pre-iOS 17 / legacy)
```swift
struct ContentView: View {
    @StateObject private var viewModel = ContentViewModel()

    var body: some View {
        // View implementation
    }
}

@MainActor
class ContentViewModel: ObservableObject {
    @Published var items: [Item] = []
    @Published var isLoading = false

    func loadItems() async {
        isLoading = true
        // Load items
        isLoading = false
    }
}
```

### Reusable View Modifier
```swift
struct CardModifier: ViewModifier {
    func body(content: Content) -> some View {
        content
            .padding()
            .background(Color(.systemBackground))
            .cornerRadius(12)
            .shadow(radius: 4)
    }
}

extension View {
    func cardStyle() -> some View {
        modifier(CardModifier())
    }
}
```
</content>

© Mindrally · Apache-2.0 · Mindrally/skills

Похожие скиллы

Всё по теме «Мобильная разработка» →
ios-swift-development aj-geddes Скилл для разработки нативных iOS-приложений на Swift: MVVM, SwiftUI, сеть через URLSession, Combine и Core Data. CX Codex +1 1 500установок swiftui-patterns affaan-m Задаёт правила современной разработки на SwiftUI: переход на @Observable, типобезопасная навигация и оптимизация рендеринга. Пригодится при верстке экранов под iOS и macOS. CX Codex +1 4 600установок swiftui-specialist superagents-lab Скилл для ИИ-агентов, который подсказывает идиоматичные приёмы SwiftUI при написании, ревью и правке кода. CX Codex +1 864установок swift-development rshankras Разбирает конкурентность, память и размер Swift-кода: подскажет, как перейти на строгую модель Swift 6 и убрать лишние аллокации. CX Codex +1 488установок swift-expert VoltAgent Community Субагент помогает разрабатывать Swift-приложения для iOS, macOS и серверного Swift. Подходит для SwiftUI, async/await, акторов и проверки управления памятью. 378установок SwiftUI iOS App taste f Набор правил для SwiftUI-проекта: как строить экраны, где хранить состояние и что делать с устаревшими API. Пригодится, когда агент пишет новый код для iOS. GP ChatGPT ★ 174 597звёзд репо

Из того же набора168

nx Скилл задаёт агенту правила работы с Nx: структура apps и libs, теги, границы модулей, генераторы и кэш. Пригодится, если проект уже собран на Nx. CX Codex +1 682установок langchain-development Задаёт агенту правила разработки на LangChain и LangGraph: композиция цепочек, агенты, память, RAG. Пригодится, когда проект на Python растёт и код надо держать в одном стиле. CX Codex +1 681установок apollo-graphql Скилл задаёт агенту правила работы с Apollo Client: запросы, мутации, фрагменты, кэш и оптимистичные обновления в React-проектах на GraphQL. CX Codex +1 677установок monorepo-tamagui Задаёт агенту правила разработки кросс-платформенного монорепо на Tamagui, Turbo, Next.js, Expo и Supabase. Пригодится, когда в одном репозитории живут веб и мобильное приложение. CX Codex +1 677установок react-native-cursor-rules Набор правил React Native для ИИ-агента: TypeScript, функциональные компоненты, оптимизация ререндеров и FlatList. Пригодится, когда агент пишет код для мобильного приложения. CX Codex +1 670установок netlify-development Скилл с правилами сборки и деплоя на Netlify: serverless- и edge-функции, Blobs, Image CDN, конфигурация сборки. Пригодится, когда агент пишет функции или правит netlify.toml. CX Codex +1 665установок viewcomfy-api-rules Помогает подключить ViewComfy API к веб-приложению на Python и FastAPI: разобрать параметры workflow, вызвать endpoint и сохранить готовые файлы. CX Codex +1 663установок salesforce-development Скилл задаёт агенту правила разработки на Salesforce: Apex, триггеры, Lightning Web Components, SOQL и метаданные. Пригодится, когда пишете код для org и хотите, чтобы агент держал стиль и лимиты платформы. CX Codex +1 659установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой