Agent skills for iOS, iPadOS, Swift, SwiftUI, and modern Apple framework development.
71
89%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Advisory
Suggest reviewing before use
Patterns for bridging callback-based, delegate-based, and GCD code into Swift Concurrency.
Use withCheckedContinuation (non-throwing) or withCheckedThrowingContinuation (throwing) to bridge completion-handler APIs into async/await. Available iOS 13+.
Docs: withCheckedContinuation · withCheckedThrowingContinuation
func fetchData() async throws -> Data {
try await withCheckedThrowingContinuation { continuation in
legacyFetch { result in
switch result {
case .success(let data):
continuation.resume(returning: data)
case .failure(let error):
continuation.resume(throwing: error)
}
}
}
}withCheckedContinuation detects misuse at runtime with diagnostics. Use withUnsafeContinuation only in performance-critical paths after correctness is proven.class LocationBridge: NSObject, CLLocationManagerDelegate {
private var continuation: CheckedContinuation<CLLocation, any Error>?
private let manager = CLLocationManager()
func requestLocation() async throws -> CLLocation {
try await withCheckedThrowingContinuation { continuation in
self.continuation = continuation
manager.delegate = self
manager.requestLocation()
}
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
continuation?.resume(returning: locations[0])
continuation = nil
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
continuation?.resume(throwing: error)
continuation = nil
}
}func fetchWithCancellation() async throws -> Data {
try await withTaskCancellationHandler {
try await withCheckedThrowingContinuation { continuation in
let task = legacyFetch { result in
switch result {
case .success(let data): continuation.resume(returning: data)
case .failure(let error): continuation.resume(throwing: error)
}
}
// Store task for cancellation
}
} onCancel: {
// Cancel the underlying work
}
}For APIs that deliver multiple values over time (delegates, NotificationCenter), use AsyncStream:
func locationUpdates() -> AsyncStream<CLLocation> {
AsyncStream { continuation in
let delegate = StreamingLocationDelegate(continuation: continuation)
continuation.onTermination = { _ in
delegate.stop()
}
delegate.start()
}
}| GCD Pattern | Swift Concurrency Replacement |
|---|---|
DispatchQueue.main.async { } | @MainActor isolation or MainActor.run { } |
DispatchQueue.global().async { } | Task { } or Task.detached { } (Swift 6.2: @concurrent) |
DispatchGroup | async let or TaskGroup |
DispatchSemaphore | Actor isolation or AsyncStream |
DispatchWorkItem with cancel | Task with task.cancel() |
DispatchQueue serial queue | actor |
DispatchQueue.concurrentPerform | withTaskGroup |
DispatchSource.makeTimerSource | Task.sleep(for:) in a loop, or Clock |
// Before (GCD)
let group = DispatchGroup()
for url in urls {
group.enter()
fetch(url) { _ in group.leave() }
}
group.notify(queue: .main) { updateUI() }
// After (Swift Concurrency)
let results = await withTaskGroup(of: Data?.self) { group in
for url in urls {
group.addTask { try? await fetch(url) }
}
return await group.reduce(into: [Data]()) { if let d = $1 { $0.append(d) } }
}
updateUI(results)// Before
let serialQueue = DispatchQueue(label: "com.app.cache")
serialQueue.async { self.cache[key] = value }
// After
actor Cache {
private var storage: [String: Data] = [:]
func set(_ key: String, _ value: Data) { storage[key] = value }
func get(_ key: String) -> Data? { storage[key] }
}skills
accessorysetupkit
references
activitykit
references
adattributionkit
references
alarmkit
references
app-clips
app-intents
references
app-store-optimization
app-store-review
apple-on-device-ai
appmigrationkit
references
audioaccessorykit
references
authentication
references
avkit
references
background-processing
references
browserenginekit
references
callkit
references
carplay
references
cloudkit
references
contacts-framework
references
core-bluetooth
references
core-data
core-motion
references
core-nfc
references
coreml
references
cryptokit
references
cryptotokenkit
references
debugging-instruments
device-integrity
references
dockkit
references
energykit
references
eventkit
references
financekit
references
focus-engine
gamekit
references
healthkit
references
homekit
references
ios-accessibility
ios-localization
ios-networking
ios-simulator
references
mapkit
metrickit
references
musickit
references
natural-language
references
paperkit
references
passkit
references
pdfkit
references
pencilkit
references
permissionkit
references
photokit
push-notifications
realitykit
references
relevancekit
references
scenekit
references
sensorkit
references
speech-recognition
spritekit
references
storekit
swift-api-design-guidelines
swift-architecture
swift-charts
references
swift-codable
swift-concurrency
swift-formatstyle
swift-language
swift-security
references
swift-testing
swiftdata
swiftlint
swiftui-animation
swiftui-gestures
references
swiftui-layout-components
swiftui-liquid-glass
references
swiftui-patterns
swiftui-performance
swiftui-uikit-interop
swiftui-webkit
tabletopkit
references
tipkit
references
vision-framework
weatherkit
references
widgetkit
references