Loading...
Loading...
Develop SwiftUI applications for iOS/macOS. Use when writing SwiftUI views, managing state, or building Apple platform UIs.
npx skill4agent add beshkenadze/claude-skills-marketplace swiftui-developer@State@Observable@Environment// 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 { ... }
}| Wrapper | Use Case |
|---|---|
| Local value types, simple state, @Observable objects |
| Two-way connection to parent state |
| Shared app-wide data, system values |
| Modern observable objects (iOS 17+) |
.primary.secondary.accessibilityLabel.accessibilityHintLazyVStackLazyHStackbodyimport 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")
}
}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)
}
}
}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()
}
}
}@Observable.font(.body)LazyVStackLazyHStack@State@ObservedObject@StateObject@Statebody.presentationSizing(.form)@Entryreference/state-management.mdhig-checklist.md