Expert skill for native iOS development with Swift and SwiftUI
Generates SwiftUI views, implements state management, and executes Xcode build commands for native iOS development.
npx claudepluginhub a5c-ai/babysitterThis skill inherits all available tools. When active, it can use any tool Claude has access to.
README.mdThis skill provides expert capabilities for native iOS development using Swift and SwiftUI. It enables generation of SwiftUI views, implementation of state management patterns, Combine reactive programming, and comprehensive Xcode build operations.
bash - Execute xcodebuild, swift, and xcrun commandsread - Analyze Swift source files and Xcode project configurationswrite - Generate and modify Swift code and SwiftUI viewsedit - Update existing Swift code and configurationsglob - Search for Swift files and Xcode project filesgrep - Search for patterns in Swift codebaseView Generation
State Management
Navigation
Reactive Patterns
Data Flow
Build Operations
Code Signing
XCTest Framework
Performance Testing
This skill integrates with the following processes:
swiftui-app-development.js - SwiftUI app architectureios-core-data-implementation.js - Core Data integrationios-push-notifications.js - APNs configurationios-appstore-submission.js - App Store submissionmobile-accessibility-implementation.js - Accessibility featuresMyApp/
├── MyApp/
│ ├── App/
│ │ ├── MyAppApp.swift
│ │ └── ContentView.swift
│ ├── Features/
│ │ └── FeatureName/
│ │ ├── Views/
│ │ ├── ViewModels/
│ │ └── Models/
│ ├── Core/
│ │ ├── Extensions/
│ │ ├── Utilities/
│ │ └── Services/
│ ├── Resources/
│ │ └── Assets.xcassets
│ └── Info.plist
├── MyAppTests/
├── MyAppUITests/
└── MyApp.xcodeproj
// MyAppApp.swift
import SwiftUI
@main
struct MyAppApp: App {
@StateObject private var appState = AppState()
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(appState)
}
}
}
// Features/Home/Views/HomeView.swift
import SwiftUI
struct HomeView: View {
@StateObject private var viewModel = HomeViewModel()
@State private var searchText = ""
var body: some View {
NavigationStack {
List {
ForEach(viewModel.filteredItems) { item in
NavigationLink(value: item) {
ItemRowView(item: item)
}
}
}
.navigationTitle("Home")
.searchable(text: $searchText)
.onChange(of: searchText) { _, newValue in
viewModel.search(query: newValue)
}
.navigationDestination(for: Item.self) { item in
ItemDetailView(item: item)
}
.refreshable {
await viewModel.refresh()
}
}
}
}
#Preview {
HomeView()
}
// Features/Home/ViewModels/HomeViewModel.swift
import Foundation
import Combine
@MainActor
final class HomeViewModel: ObservableObject {
@Published private(set) var items: [Item] = []
@Published private(set) var filteredItems: [Item] = []
@Published private(set) var isLoading = false
@Published private(set) var error: Error?
private let itemService: ItemServiceProtocol
private var cancellables = Set<AnyCancellable>()
init(itemService: ItemServiceProtocol = ItemService()) {
self.itemService = itemService
setupBindings()
Task { await loadItems() }
}
private func setupBindings() {
$items
.assign(to: &$filteredItems)
}
func loadItems() async {
isLoading = true
error = nil
do {
items = try await itemService.fetchItems()
} catch {
self.error = error
}
isLoading = false
}
func search(query: String) {
if query.isEmpty {
filteredItems = items
} else {
filteredItems = items.filter { $0.title.localizedCaseInsensitiveContains(query) }
}
}
func refresh() async {
await loadItems()
}
}
// Core/ViewModifiers/CardStyle.swift
import SwiftUI
struct CardStyle: ViewModifier {
var cornerRadius: CGFloat = 12
var shadowRadius: CGFloat = 4
func body(content: Content) -> some View {
content
.background(Color(.systemBackground))
.cornerRadius(cornerRadius)
.shadow(color: .black.opacity(0.1), radius: shadowRadius, x: 0, y: 2)
}
}
extension View {
func cardStyle(cornerRadius: CGFloat = 12, shadowRadius: CGFloat = 4) -> some View {
modifier(CardStyle(cornerRadius: cornerRadius, shadowRadius: shadowRadius))
}
}
// App/Router.swift
import SwiftUI
enum Route: Hashable {
case home
case detail(id: String)
case settings
case profile(userId: String)
}
final class Router: ObservableObject {
@Published var path = NavigationPath()
func navigate(to route: Route) {
path.append(route)
}
func navigateBack() {
path.removeLast()
}
func navigateToRoot() {
path.removeLast(path.count)
}
func handle(url: URL) -> Bool {
guard let components = URLComponents(url: url, resolvingAgainstBaseURL: true),
let host = components.host else {
return false
}
switch host {
case "detail":
if let id = components.queryItems?.first(where: { $0.name == "id" })?.value {
navigate(to: .detail(id: id))
return true
}
case "profile":
if let userId = components.queryItems?.first(where: { $0.name == "userId" })?.value {
navigate(to: .profile(userId: userId))
return true
}
default:
break
}
return false
}
}
# Build for simulator
xcodebuild -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone 15 Pro' build
# Build for device
xcodebuild -scheme MyApp -destination 'generic/platform=iOS' build
# Archive for distribution
xcodebuild -scheme MyApp -archivePath ./build/MyApp.xcarchive archive
# Export IPA
xcodebuild -exportArchive -archivePath ./build/MyApp.xcarchive -exportPath ./build -exportOptionsPlist ExportOptions.plist
# Run tests
xcodebuild test -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone 15 Pro'
Xcode build cache issues
rm -rf ~/Library/Developer/Xcode/DerivedData
Code signing issues
security find-identity -v -p codesigning
Swift Package resolution
swift package resolve
# Or in Xcode: File > Packages > Reset Package Caches
Simulator issues
xcrun simctl erase all
ios-persistence - Core Data and Realm integrationpush-notifications - APNs configurationmobile-security - iOS security implementationapp-store-connect - App Store submissionActivates when the user asks about AI prompts, needs prompt templates, wants to search for prompts, or mentions prompts.chat. Use for discovering, retrieving, and improving prompts.
Search, retrieve, and install Agent Skills from the prompts.chat registry using MCP tools. Use when the user asks to find skills, browse skill catalogs, install a skill for Claude, or extend Claude's capabilities with reusable AI agent components.
This skill should be used when the user wants to "create a skill", "add a skill to plugin", "write a new skill", "improve skill description", "organize skill content", or needs guidance on skill structure, progressive disclosure, or skill development best practices for Claude Code plugins.