| name | ios_developer |
| description | Comprehensive iOS development guidance covering SwiftUI, Swift Concurrency, Core Data, and Swift Testing |
iOS Developer
You are an iOS development expert. This skill aggregates best practices from specialized agent skills for comprehensive iOS app development.
When to Use
- Building iOS/macOS/visionOS applications
- Working with SwiftUI views and state management
- Implementing Swift Concurrency patterns
- Using Core Data for persistence
- Writing tests with Swift Testing framework
- Migrating to modern Swift patterns
Decision Tree
Core Principles
- Use Modern APIs - Prefer
@Observable over ObservableObject, NavigationStack over NavigationView
- Actor Isolation - Understand
@MainActor and custom actors for thread safety
- Structured Concurrency - Use task groups over
Task.detached when possible
- Context Safety - Never pass
NSManagedObject across Core Data contexts
- Test with Swift Testing - Prefer
#expect and #require over XCTest assertions
Quick Reference
SwiftUI State Management
@Observable
@MainActor
final class ViewModel {
var items: [Item] = []
func load() async {
items = await fetchItems()
}
}
struct ContentView: View {
@State private var viewModel = ViewModel()
var body: some View {
List(viewModel.items) { item in
Text(item.name)
}
.task {
await viewModel.load()
}
}
}
Swift Concurrency
func fetchAllData() async throws -> [Data] {
try await withThrowingTaskGroup(of: Data.self) { group in
for url in urls {
group.addTask { try await fetch(url) }
}
return try await group.reduce(into: []) { $0.append($1) }
}
}
actor DataStore {
private var cache: [String: Data] = [:]
func get(_ key: String) -> Data? { cache[key] }
func set(_ key: String, _ value: Data) { cache[key] = value }
}
Core Data Background Context
func importData(_ items: [ImportItem]) async throws {
let context = container.newBackgroundContext()
try await context.perform {
for item in items {
let entity = Entity(context: context)
entity.configure(from: item)
}
try context.save()
}
}
let objectID = managedObject.objectID
Task.detached {
let context = container.newBackgroundContext()
let object = try context.existingObject(with: objectID)
}
Swift Testing
import Testing
@Test("User login succeeds with valid credentials")
func loginSuccess() async throws {
let auth = AuthService()
let user = try #require(await auth.login(email: "test@example.com", password: "valid"))
#expect(user.isAuthenticated)
}
@Test(arguments: ["admin", "user", "guest"])
func rolePermissions(role: String) {
let permissions = Permissions(role: role)
#expect(permissions.canRead)
}
References
- swiftui.md - SwiftUI best practices, state management, modern APIs
- whats-new-swiftui/ - SwiftUI features by iOS version (14, 15, 16, 17, 18, 26)
- whats-new-swift/ - Swift language features by version (5.1-6.1)
- swift-concurrency.md - async/await, actors, Sendable, Swift 6 migration
- core-data.md - Core Data patterns, threading, migrations
- swift-testing.md - Swift Testing framework, XCTest migration
- swift.md - General Swift development patterns
External Resources
For more reference, use these open-source agent skills and documentation services:
AvdLee Skills
Dimillian Skills
- Skills Repository - iOS development skills collection
- SwiftUI Liquid Glass - iOS 26+ Liquid Glass API
- SwiftUI UI Patterns - View composition and state
- SwiftUI View Refactor - Code consistency patterns
- SwiftUI Performance Audit - Performance optimization
- Swift Concurrency Expert - Swift 6.2+ concurrency
- iOS Debugger Agent - Build and debug workflows
- App Store Changelog - Release notes generation
twostraws Skills
Apple Documentation
- sosumi.ai - AI-readable Apple Developer documentation
- Replace
developer.apple.com with sosumi.ai in URLs (e.g., https://sosumi.ai/documentation/swiftui/view)
- MCP server at
https://sosumi.ai/mcp with tools: searchAppleDocumentation, fetchAppleDocumentation, fetchAppleVideoTranscript