Swift
// Write safe Swift code avoiding memory leaks, optional traps, and concurrency bugs.
$ git log --oneline --stat
stars:1,933
forks:367
updated:March 4, 2026
SKILL.mdreadonly
SKILL.md Frontmatter
nameSwift
slugswift
version1.0.1
descriptionWrite safe Swift code avoiding memory leaks, optional traps, and concurrency bugs.
metadata[object Object]
Quick Reference
| Topic | File |
|---|---|
| Optionals, nil safety, force unwrap | optionals.md |
| Retain cycles, weak refs, closures | memory.md |
| async/await, actors, Sendable, value types | concurrency.md |
| JSON encoding/decoding traps | codable.md |
| Protocols, collections, strings, errors, build | types.md |
| SwiftUI state (@State, @Binding, Combine) | swiftui.md |
| Property wrappers, actors, result builders, macros | advanced.md |
| XCTest pitfalls, SPM gotchas | testing.md |
Critical Rules
Memory & Safety
- Force unwrap
!crashes on nil — useguard letorif letinstead - Closures capturing
selfstrongly create retain cycles — use[weak self]in escaping closures - Delegates must be
weak— strong delegate = object never deallocates try!crashes on any error — never use in production pathsremoveFirst()crashes on empty — usepopFirst()for safety
Concurrency
async letstarts immediately — not when youawait- Actor reentrancy at every
await— state may change between suspension points @MainActordoesn't guarantee immediate main thread — it's queuedSendableconformance violations crash at runtime — compiler warnings are errors
Types & Collections
- Protocol extensions don't override — static dispatch ignores subclass implementation
- Mutating struct in collection requires reassignment —
array[0].mutate()doesn't work String.Indexfrom one string invalid on another — even if contents match
SwiftUI
@StateObjectowns,@ObservedObjectborrows — recreating view loses ObservedObject state@EnvironmentObjectcrashes if not injected — no compile-time check- View identity change resets all
@State— changing ID loses state
Build
print()builds strings even in release — remove or use os_log- Generic code bloat — specialized for each type, increases binary size