Back to skills
SkillHub ClubShip Full StackFull Stack

swiftui-developer

Imported from https://github.com/beshkenadze/claude-skills-marketplace.

Packaged view

This page reorganizes the original catalog entry around fit, installability, and workflow context first. The original raw source lives below.

Stars
1
Hot score
77
Updated
March 20, 2026
Overall rating
C2.8
Composite score
2.8
Best-practice grade
A92.4

Install command

npx @skill-hub/cli install beshkenadze-claude-skills-marketplace-swiftui-developer

Repository

beshkenadze/claude-skills-marketplace

Skill path: skills/development/swiftui-developer

Imported from https://github.com/beshkenadze/claude-skills-marketplace.

Open repository

Best for

Primary workflow: Ship Full Stack.

Technical facets: Full Stack.

Target audience: everyone.

License: Unknown.

Original source

Catalog source: SkillHub Club.

Repository owner: beshkenadze.

This is still a mirrored public skill entry. Review the repository before installing into production workflows.

What it helps with

  • Install swiftui-developer into Claude Code, Codex CLI, Gemini CLI, or OpenCode workflows
  • Review https://github.com/beshkenadze/claude-skills-marketplace before adding swiftui-developer to shared team environments
  • Use swiftui-developer for development workflows

Works across

Claude CodeCodex CLIGemini CLIOpenCode

Favorites: 0.

Sub-skills: 0.

Aggregator: No.

Original source / Raw SKILL.md

---
name: swiftui-developer
description: Develop SwiftUI applications for iOS/macOS. Use when writing SwiftUI views, managing state, or building Apple platform UIs.
version: 1.0.0
---

# SwiftUI Developer

## Overview

Expert guidance for building professional SwiftUI applications targeting iOS 17+/macOS 14+ with modern patterns, accessibility compliance, and optimal performance.

## Instructions

When writing SwiftUI code, follow this workflow:

### 1. Assess Requirements

- Target platform (iOS, macOS, visionOS, watchOS)
- Minimum OS version (determines available APIs)
- Complexity level (simple view vs. full feature)

### 2. Choose Architecture

**For simple views:**
- Use `@State` for local state
- No ViewModel needed for pure display views

**For complex features:**
- Use MVVM with `@Observable` macro (iOS 17+)
- Keep ViewModel logic separate from View
- Use `@Environment` for shared data

### 3. Apply State Management

```swift
// iOS 17+ Modern Pattern
@Observable
class FeatureViewModel {
    var items: [Item] = []
    @ObservationIgnored var cache: Cache? // Non-observed
}

struct FeatureView: View {
    @State private var viewModel = FeatureViewModel()
    var body: some View { ... }
}
```

**Property Wrapper Selection:**
| Wrapper | Use Case |
|---------|----------|
| `@State` | Local value types, simple state, @Observable objects |
| `@Binding` | Two-way connection to parent state |
| `@Environment` | Shared app-wide data, system values |
| `@Observable` | Modern observable objects (iOS 17+) |

### 4. Follow HIG Principles

- Touch targets: minimum 44×44 points
- Text: 17pt body minimum, support Dynamic Type
- Colors: use semantic colors (`.primary`, `.secondary`)
- Accessibility: add `.accessibilityLabel`, `.accessibilityHint`

### 5. Optimize Performance

- Extract reusable subviews
- Use `LazyVStack`/`LazyHStack` for lists
- Avoid heavy computation in `body`
- Keep state minimal and locally scoped

## Examples

### Example: Settings Screen with Toggle

**Input:**
"Create a settings view with dark mode toggle and notification preferences"

**Output:**
```swift
import SwiftUI

@Observable
class SettingsViewModel {
    var isDarkMode: Bool {
        didSet { UserDefaults.standard.set(isDarkMode, forKey: "darkMode") }
    }
    var notificationsEnabled: Bool {
        didSet { UserDefaults.standard.set(notificationsEnabled, forKey: "notifications") }
    }

    init() {
        isDarkMode = UserDefaults.standard.bool(forKey: "darkMode")
        notificationsEnabled = UserDefaults.standard.bool(forKey: "notifications")
    }
}

struct SettingsView: View {
    @State private var viewModel = SettingsViewModel()

    var body: some View {
        Form {
            Section("Appearance") {
                Toggle("Dark Mode", isOn: $viewModel.isDarkMode)
                    .accessibilityHint("Switches between light and dark appearance")
            }

            Section("Notifications") {
                Toggle("Enable Notifications", isOn: $viewModel.notificationsEnabled)
                    .accessibilityHint("Allows the app to send you notifications")
            }
        }
        .navigationTitle("Settings")
    }
}
```

### Example: List with Navigation

**Input:**
"Create a list of items with detail navigation"

**Output:**
```swift
import SwiftUI

struct Item: Identifiable {
    let id = UUID()
    let title: String
    let subtitle: String
}

struct ItemListView: View {
    let items: [Item]

    var body: some View {
        List(items) { item in
            NavigationLink(value: item) {
                VStack(alignment: .leading, spacing: 4) {
                    Text(item.title)
                        .font(.headline)
                    Text(item.subtitle)
                        .font(.subheadline)
                        .foregroundStyle(.secondary)
                }
                .padding(.vertical, 4)
            }
            .accessibilityLabel("\(item.title), \(item.subtitle)")
        }
        .navigationTitle("Items")
        .navigationDestination(for: Item.self) { item in
            ItemDetailView(item: item)
        }
    }
}
```

### Example: Async Data Loading

**Input:**
"Create a view that loads data from an API"

**Output:**
```swift
import SwiftUI

@Observable
class DataViewModel {
    var items: [Item] = []
    var isLoading = false
    var errorMessage: String?

    func loadData() async {
        isLoading = true
        errorMessage = nil

        do {
            items = try await APIService.shared.fetchItems()
        } catch {
            errorMessage = error.localizedDescription
        }

        isLoading = false
    }
}

struct DataView: View {
    @State private var viewModel = DataViewModel()

    var body: some View {
        Group {
            if viewModel.isLoading {
                ProgressView("Loading...")
            } else if let error = viewModel.errorMessage {
                ContentUnavailableView(
                    "Error",
                    systemImage: "exclamationmark.triangle",
                    description: Text(error)
                )
            } else {
                List(viewModel.items) { item in
                    Text(item.title)
                }
            }
        }
        .task {
            await viewModel.loadData()
        }
        .refreshable {
            await viewModel.loadData()
        }
    }
}
```

## Guidelines

### Do

- Use `@Observable` for iOS 17+ projects (better performance)
- Support Dynamic Type with `.font(.body)` etc.
- Add accessibility labels to interactive elements
- Use `LazyVStack`/`LazyHStack` for large collections
- Extract complex subviews to prevent unnecessary redraws
- Use semantic colors for automatic dark mode support

### Don't

- Use `@State` with reference types (causes memory leaks)
- Use `@ObservedObject` to create objects in view (use `@StateObject` or `@State`)
- Put heavy computation in `body` property
- Hardcode colors/sizes (breaks accessibility)
- Ignore the 44×44pt minimum touch target
- Skip accessibility labels on buttons/images

### iOS 18+ Features

- Floating tab bar with sidebar flexibility
- `.presentationSizing(.form)` for sheets
- Zoom navigation transitions
- Control Center widgets
- `@Entry` macro for environment keys
- Mesh gradients

## Additional Resources

See `reference/` directory for:
- `state-management.md` - Property wrapper decision guide
- `hig-checklist.md` - HIG compliance checklist
swiftui-developer | SkillHub