---
description: Swift Tooling and Build System
alwaysApply: false
---

# Swift Tooling and Build System

Swift Package Manager, Xcode, static analysis, and CI pipelines.

## Swift Package Manager

```swift
// swift-tools-version: 6.0
let package = Package(
    name: "MyApp",
    platforms: [.iOS(.v17), .macOS(.v14)],
    products: [
        .library(name: "MyAppCore", targets: ["MyAppCore"]),
    ],
    dependencies: [
        .package(url: "https://github.com/apple/swift-argument-parser", from: "1.3.0"),
        .package(url: "https://github.com/apple/swift-log", from: "1.5.0"),
    ],
    targets: [
        .target(name: "MyAppCore", dependencies: [
            .product(name: "Logging", package: "swift-log"),
        ]),
        .testTarget(name: "MyAppCoreTests", dependencies: ["MyAppCore"]),
    ]
)
```

## Essential Commands

```bash
swift build                          # Debug build
swift build -c release               # Release build
swift test --parallel                # Run tests
swift package resolve                # Resolve deps
swiftlint --strict                   # Static analysis
```

## Build Settings

```
SWIFT_STRICT_CONCURRENCY = complete    # Full Sendable checking
GCC_TREAT_WARNINGS_AS_ERRORS = YES     # Zero-warning policy
SWIFT_TREAT_WARNINGS_AS_ERRORS = YES
```

## Logging

```swift
import os

private let logger = Logger(subsystem: "com.example.myapp", category: "networking")
logger.info("Fetching user \(userId, privacy: .public)")
logger.error("Failed: \(error.localizedDescription, privacy: .public)")
// debug/info not persisted by default — minimal performance cost
```

## CI Essentials

```bash
swift build
swift test --parallel
swiftlint --strict
xcodebuild test -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone 16'
```

## Anti-Patterns

```swift
// Never: print() for production logging — use os.Logger
// Never: Cocoapods for new projects when SPM works
// Never: Hardcoded strings for UI — use String(localized:)
```
