Swift Skill
Swift concurrency and testing: async/await, Actors, TaskGroups, Sendable, structured concurrency, XCTest, Swift Testing framework, and async test patterns.
Reference Loading Table
| Signal |
Reference |
Size |
| async/await, Task, Sendable |
references/fundamentals.md |
~20 lines |
| Actor, @MainActor, nonisolated |
references/actor-isolation.md |
~20 lines |
| TaskGroup, AsyncSequence, AsyncStream, cancellation |
references/task-patterns.md |
~20 lines |
| Failure modes, common mistakes |
references/preferred-patterns.md |
~20 lines |
| concurrency overview, structured concurrency patterns |
references/swift-concurrency.md |
~30 lines |
| XCTest, Swift Testing, test doubles, async tests, UI tests |
references/swift-testing.md |
~250 lines |
Loading rule. Read the references whose signals match the task before responding.
Core Rules (Always Apply)
Concurrency
- Prefer structured concurrency -- use
TaskGroup over loose Task { } whenever possible; structured tasks propagate cancellation and errors automatically.
- Mark types Sendable -- enable strict concurrency checking (
-strict-concurrency=complete) and resolve all warnings before they become errors in Swift 6.
- Use actors for shared mutable state -- avoid manual locks; actors provide compiler-verified safety.
- Cancel what you create -- every
Task stored in a property should have a corresponding cancellation path.
- Minimize @MainActor surface -- isolate only the UI layer; keep business logic and networking off the main actor.
Testing
- One assertion per concept -- a single test can have multiple assertions if they verify the same logical behavior, but avoid testing unrelated things together.
- Arrange-Act-Assert -- structure every test into setup, execution, and verification phases.
- Name tests descriptively --
testFetchUser_withExpiredToken_throwsAuthError is better than testFetch2.
- Prefer Swift Testing for new code -- use
@Test and #expect when targeting Swift 5.9+; fall back to XCTest for older targets or UI tests.
- Ensure test independence -- each test must be runnable in isolation; always produce self-contained test state.
Phase 1: ASSESS
Determine what kind of Swift work is needed:
| Request type |
Load references |
Action |
| Concurrency patterns |
fundamentals, actor-isolation, task-patterns |
Pattern guidance |
| Concurrency mistakes |
preferred-patterns |
Failure mode detection |
| Write tests |
swift-testing |
Test authoring |
| Async test patterns |
swift-testing + fundamentals |
Async test guidance |
| Full concurrency review |
swift-concurrency + all concurrency refs |
Full review pass |
Gate: Request classified and relevant references loaded.
Phase 2: EXECUTE
Apply loaded reference knowledge to the user's code or question.
For concurrency work:
- Verify structured concurrency used where possible
- Check Sendable conformance
- Validate actor isolation boundaries
- Confirm cancellation paths exist
For testing work:
- Use Swift Testing (
@Test, #expect) for new code on Swift 5.9+
- Use
@dataProvider-style parameterized tests with arguments:
- Use protocol-based mock injection
- Use XCTest for UI tests and older targets
Gate: Specific, reference-backed feedback or code provided.
Phase 3: VERIFY
Run the test suite and confirm:
swift test --enable-code-coverage
swift build
Gate: All tests pass. Build succeeds with strict concurrency checking.
1---2name: swift3description: Swift development: concurrency patterns, async/await, actors, testing with XCTest and Swift Testing framework.4---56# Swift Skill78Swift concurrency and testing: async/await, Actors, TaskGroups, Sendable, structured concurrency, XCTest, Swift Testing framework, and async test patterns.910## Reference Loading Table1112| Signal | Reference | Size |13|--------|-----------|------|14| async/await, Task, Sendable | `references/fundamentals.md` | ~20 lines |15| Actor, @MainActor, nonisolated | `references/actor-isolation.md` | ~20 lines |16| TaskGroup, AsyncSequence, AsyncStream, cancellation | `references/task-patterns.md` | ~20 lines |17| Failure modes, common mistakes | `references/preferred-patterns.md` | ~20 lines |18| concurrency overview, structured concurrency patterns | `references/swift-concurrency.md` | ~30 lines |19| XCTest, Swift Testing, test doubles, async tests, UI tests | `references/swift-testing.md` | ~250 lines |2021**Loading rule.** Read the references whose signals match the task before responding.2223---2425## Core Rules (Always Apply)2627### Concurrency2829- **Prefer structured concurrency** -- use `TaskGroup` over loose `Task { }` whenever possible; structured tasks propagate cancellation and errors automatically.30- **Mark types Sendable** -- enable strict concurrency checking (`-strict-concurrency=complete`) and resolve all warnings before they become errors in Swift 6.31- **Use actors for shared mutable state** -- avoid manual locks; actors provide compiler-verified safety.32- **Cancel what you create** -- every `Task` stored in a property should have a corresponding cancellation path.33- **Minimize @MainActor surface** -- isolate only the UI layer; keep business logic and networking off the main actor.3435### Testing3637- **One assertion per concept** -- a single test can have multiple assertions if they verify the same logical behavior, but avoid testing unrelated things together.38- **Arrange-Act-Assert** -- structure every test into setup, execution, and verification phases.39- **Name tests descriptively** -- `testFetchUser_withExpiredToken_throwsAuthError` is better than `testFetch2`.40- **Prefer Swift Testing for new code** -- use `@Test` and `#expect` when targeting Swift 5.9+; fall back to XCTest for older targets or UI tests.41- **Ensure test independence** -- each test must be runnable in isolation; always produce self-contained test state.4243---4445## Phase 1: ASSESS4647Determine what kind of Swift work is needed:4849| Request type | Load references | Action |50|-------------|----------------|--------|51| Concurrency patterns | fundamentals, actor-isolation, task-patterns | Pattern guidance |52| Concurrency mistakes | preferred-patterns | Failure mode detection |53| Write tests | swift-testing | Test authoring |54| Async test patterns | swift-testing + fundamentals | Async test guidance |55| Full concurrency review | swift-concurrency + all concurrency refs | Full review pass |5657**Gate**: Request classified and relevant references loaded.5859---6061## Phase 2: EXECUTE6263Apply loaded reference knowledge to the user's code or question.6465For concurrency work:661. Verify structured concurrency used where possible672. Check Sendable conformance683. Validate actor isolation boundaries694. Confirm cancellation paths exist7071For testing work:721. Use Swift Testing (`@Test`, `#expect`) for new code on Swift 5.9+732. Use `@dataProvider`-style parameterized tests with `arguments:`743. Use protocol-based mock injection754. Use XCTest for UI tests and older targets7677**Gate**: Specific, reference-backed feedback or code provided.7879---8081## Phase 3: VERIFY8283Run the test suite and confirm:8485```bash86swift test --enable-code-coverage87swift build88```8990**Gate**: All tests pass. Build succeeds with strict concurrency checking.