SkillAtlasSkill 详情

swift-language

86 agent skills optimized for iOS 26+ development with Swift 6.

审核状态:已审核Quality 80Security 88

复制安装命令

用 Codex 或 Claude 安装复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它先审查 Skill 页面再帮你安装。

复制前请先查看来源、License 和安全提示。

项目 README

来源文件:README.md

抓取于 2026年8月22日

Swift iOS Skills — Agent Skills for iOS 26+ & SwiftUI Development

GitHub stars Swift 6.3 Platform Claude Code OpenAI Codex Agent Skills tessl License: PolyForm Perimeter

86 agent skills optimized for iOS 26+ development with Swift 6.3 and modern Apple frameworks. All code examples, patterns, and guidance target the latest APIs -- Liquid Glass, approachable concurrency, Foundation Models, StoreKit 2, SwiftData, async/await URLSession, and more. No deprecated patterns.

Compatible with Claude Code, OpenAI Codex, Cursor, GitHub Copilot, and 40+ other agents. Follows the open Agent Skills standard.

Every skill is self-contained. No skill depends on another. Install only what you need.

Release history: CHANGELOG.md.

Contents

Install

Recommended: any agent via skills CLI

The skills CLI is the recommended install method.

Interactive install (recommended):

npx skills add dpearson2699/swift-ios-skills

Running the default command opens the skills CLI UI so you can choose which skills to install and which agent(s) to install them for.

Install everything for any coding agent:

npx skills add dpearson2699/swift-ios-skills --all

Use --all when you want the full set of 86 skills installed automatically for any coding agent.

Install specific skills directly:

npx skills add dpearson2699/swift-ios-skills --skill <skill-name> --skill <skill-name>

Check for updates to installed skills:

npx skills check

Update installed skills to the latest versions:

npx skills update

Use these after installing through the skills CLI.

Claude Code (via plugin marketplace)

Add the marketplace (one-time):

/plugin marketplace add dpearson2699/swift-ios-skills

Install everything:

/plugin install all-ios-skills@swift-ios-skills

Or install a themed bundle (bundles limit how many skills load into the context window — if you want everything, use all-ios-skills above instead of installing multiple bundles):

/plugin install swiftui-skills@swift-ios-skills
/plugin install swift-core-skills@swift-ios-skills
/plugin install ios-app-framework-skills@swift-ios-skills
/plugin install ios-data-framework-skills@swift-ios-skills
/plugin install ios-ai-ml-skills@swift-ios-skills
/plugin install ios-engineering-skills@swift-ios-skills
/plugin install ios-hardware-skills@swift-ios-skills
/plugin install ios-platform-skills@swift-ios-skills
/plugin install ios-gaming-skills@swift-ios-skills
/plugin install apple-kit-skills@swift-ios-skills

OpenAI Codex

$skill-installer install https://github.com/dpearson2699/swift-ios-skills/tree/main/skills/<skill-name>

Claude Web App / Claude Desktop

  1. Download the skill folder(s) you want from this repo
  2. Zip each skill folder
  3. Go to Settings > Capabilities and enable "Code execution and file creation"
  4. Go to Customize > Skills, click +, then Upload a skill
  5. Upload the zip

ChatGPT

  1. Download the skill folder(s) you want from this repo
  2. Zip each skill folder
  3. Click your profile icon in ChatGPT and select Skills
  4. Click New skill and select Upload from your computer
  5. Upload the zip

Plugin Bundles (Claude Code)

PluginSkills included
all-ios-skillsAll 86 skills
apple-kit-skills39 skills spanning Apple Kit frameworks plus CarPlay
swiftui-skillsfocus-engine, swiftui-animation, swiftui-gestures, swiftui-layout-components, swiftui-liquid-glass, swiftui-navigation, swiftui-patterns, swiftui-performance, swiftui-uikit-interop, swiftui-webkit
swift-core-skillscore-data, swift-api-design-guidelines, swift-architecture, swift-codable, swift-charts, swift-concurrency, swift-formatstyle, swift-language, swift-testing, swiftdata
ios-app-framework-skillsactivitykit, adattributionkit, alarmkit, app-clips, app-intents, avkit, carplay, mapkit, paperkit, pdfkit, photokit, push-notifications, storekit, tipkit, widgetkit
ios-data-framework-skillscloudkit, contacts-framework, eventkit, financekit, healthkit, musickit, passkit, weatherkit
ios-ai-ml-skillsapple-on-device-ai, coreml, natural-language, speech-recognition, vision-framework
ios-engineering-skillsapp-store-optimization, app-store-review, authentication, background-processing, cryptokit, debugging-instruments, device-integrity, ios-accessibility, ios-ettrace-performance, ios-localization, ios-memgraph-analysis, ios-networking, swift-security, swiftlint, ios-simulator, metrickit
ios-hardware-skillsaccessorysetupkit, core-bluetooth, core-motion, core-nfc, dockkit, pencilkit, realitykit, sensorkit
ios-platform-skillsappmigrationkit, audioaccessorykit, browserenginekit, callkit, cryptotokenkit, energykit, homekit, permissionkit, relevancekit, shareplay-activities
ios-gaming-skillsgamekit, scenekit, spritekit, tabletopkit

Skills

SwiftUI

SkillWhat it covers
focus-engine@FocusState, defaultFocus, focusSection, focused scene values, focus restoration, UIFocusGuide
swiftui-animationSpring animations, PhaseAnimator, KeyframeAnimator, matchedGeometryEffect, SF Symbols
swiftui-gesturesTap, drag, magnify, rotate, long press, simultaneous and sequential gestures
swiftui-layout-componentsGrid, LazyVGrid, Layout protocol, ViewThatFits, custom layouts
swiftui-liquid-glassiOS 26 Liquid Glass, glassEffect, GlassEffectContainer, morphing transitions
swiftui-navigationNavigationStack, NavigationSplitView, programmatic navigation, deep linking
swiftui-patterns@Observable, state ownership, environment wiring, view composition, async loading, MV-pattern architecture
swiftui-performanceRendering performance, view update optimization, layout thrash, Instruments profiling
swiftui-uikit-interopUIViewRepresentable, UIHostingController, Coordinator, incremental UIKit-to-SwiftUI migration
swiftui-webkitWebView, WebPage, navigation policies, JavaScript calls, local content, custom URL schemes

Core Swift

SkillWhat it covers
swift-api-design-guidelinesSwift API Design Guidelines -- argument labels, mutating/nonmutating pairs, documentation comments, naming conventions
swift-architectureArchitecture patterns: MV (@Observable), MVVM, MVI, TCA, Clean Architecture, Coordinator, decision framework
swift-codableSwift Codable, JSONDecoder, JSONEncoder, CodingKeys, custom decoding, nested JSON
swift-chartsBar, line, area, pie, donut, and 3D charts, scrolling, selection, annotations
swift-concurrencySwift 6.2 concurrency, Sendable, actors, structured concurrency, data-race safety
swift-formatstyleFormatStyle protocol, number/currency/date/duration/measurement formatting, custom styles
swift-languageSwift 6.3 language idioms, result builders, property wrappers, typed throws
swift-testingSwift Testing framework, @Test, @Suite, #expect, parameterized tests, mocking
core-dataCore Data persistence, NSPersistentContainer, NSFetchedResultsController, batch operations, staged migration
swiftdata@Model, @Query, #Predicate, ModelContainer, migrations, CloudKit sync, @ModelActor

App Experience Frameworks

SkillWhat it covers
activitykitActivityKit, Dynamic Island, Lock Screen Live Activities, push-to-update
adattributionkitPrivacy-preserving ad attribution, postbacks, conversion values, re-engagement
alarmkitAlarmKit system alarms and countdown timers, Lock Screen, Dynamic Island, Live Activities
app-clipsApp Clips, invocation URLs, NFC, QR, App Clip Codes, App Group handoff
app-intentsApp Intents for Siri, Shortcuts, Spotlight, widgets, and Apple Intelligence
avkitAVPlayerViewController, VideoPlayer, Picture-in-Picture, AirPlay, subtitles
carplayCarPlay templates, navigation, audio, communication, EV charging apps
mapkitMapKit, CoreLocation, annotations, geocoding, directions, geofencing
paperkitPaperMarkupViewController, markup editing, drawing, shapes (iOS 26)
pdfkitPDFView, PDFDocument, annotations, text search, form filling, thumbnails
photokitPhotosPicker, AVCaptureSession, photo library, video recording, media permissions
push-notificationsUNUserNotificationCenter, APNs, rich notifications, silent push, service extensions
storekitStoreKit 2 purchases, subscriptions, SubscriptionStoreView, transaction verification
tipkitFeature discovery tooltips, contextual tips, tip rules, tip events
widgetkitHome Screen, Lock Screen, and StandBy widgets, Control Center controls, timeline providers

Data & Service Frameworks

SkillWhat it covers
cloudkitCKContainer, CKRecord, subscriptions, sharing, CKSyncEngine, SwiftData sync
contacts-frameworkCNContactStore, fetch requests, key descriptors, CNContactPickerViewController, save requests
eventkitEKEventStore, EKEvent, EKReminder, recurrence rules, EventKitUI editors and choosers
financekitApple Card, Apple Cash, Wallet orders, transaction queries, account balances
healthkitHKHealthStore, queries, statistics, workout sessions, background delivery
musickitMusicKit authorization, catalog search, ApplicationMusicPlayer, MPRemoteCommandCenter
passkitApple Pay, PKPaymentRequest, PKPaymentAuthorizationController, Wallet passes
weatherkitWeatherService, current/hourly/daily forecasts, alerts, attribution requirements

AI & Machine Learning

SkillWhat it covers
apple-on-device-aiFoundation Models framework, Core ML, MLX Swift, on-device LLM inference
coremlCore ML model loading, prediction, MLTensor, compute unit configuration, VNCoreMLRequest, MLComputePlan
natural-languageNLTokenizer, NLTagger, sentiment analysis, language identification, embeddings, Translation
speech-recognitionSpeechAnalyzer, SpeechTranscriber, SFSpeechRecognizer, on-device recognition, audio buffer processing
vision-frameworkVision text recognition, face/barcode detection, image segmentation, VisionKit DataScannerViewController

iOS Engineering

SkillWhat it covers
app-store-optimizationASO keyword strategy, description writing, screenshot optimization, Custom Product Pages, A/B testing
app-store-reviewApp Review guidelines, rejection prevention, privacy manifests, ATT, HIG compliance
authenticationSign in with Apple, ASAuthorizationController, passkeys, biometric auth (LAContext), credential management
background-processingBGTaskScheduler, background refresh, URLSession background transfers
cryptokitSHA-2/SHA-3, HMAC, AES-GCM, ChaChaPoly, HPKE, ML-KEM/ML-DSA, P256/Curve25519 signing, ECDH, Secure Enclave
debugging-instrumentsXcode debugger, Instruments, os_signpost, MetricKit, crash symbolication
device-integrityDeviceCheck (DCDevice per-device bits), App Attest (DCAppAttestService attestation and assertion flows)
ios-accessibilityVoiceOver, Dynamic Type, custom rotors, accessibility focus, assistive-technology support
ios-ettrace-performanceETTrace launch/runtime capture, exact-build dSYM matching, processed flamegraph JSON, comparable verification
ios-localizationString Catalogs, pluralization, FormatStyle, right-to-left layout
ios-memgraph-analysisSimulator memgraph capture, leak ownership paths, reachable heap growth, raw evidence preservation
ios-networkingURLSession async/await, REST APIs, downloads/uploads, WebSockets, pagination, retry, caching
swift-securityKeychain Services, CryptoKit symmetric/asymmetric, biometric authentication, Secure Enclave, certificate trust, credential storage, OWASP compliance · Based on ivan-magda/swift-security-skill
ios-simulatorxcrun simctl commands, device lifecycle, push/location/privacy simulation, log streaming, simulator limitations
metrickitMetricManager async reports, hang/crash diagnostics, production performance telemetry
swiftlintSwiftLint setup, .swiftlint.yml, build tool plugin, rule selection, baselines, suppressions, CI integration

Hardware & Device Integration

SkillWhat it covers
accessorysetupkitPrivacy-preserving BLE/Wi-Fi accessory discovery, ASAccessorySession, picker UI
core-bluetoothCBCentralManager, CBPeripheral, BLE scanning/connecting, services, characteristics, background modes
core-motionCMMotionManager, CMPedometer, accelerometer, gyroscope, activity recognition, altitude
core-nfcNFCNDEFReaderSession, NFCTagReaderSession, NDEF reading/writing, background tag reading
dockkitDockAccessoryManager, camera subject tracking, motor control, framing
pencilkitPKCanvasView, PKDrawing, PKToolPicker, Apple Pencil drawing and annotation
realitykitRealityView, entities, anchors, ARKit world tracking, raycasting, scene understanding
sensorkitResearch-grade sensor data, ambient light, keyboard metrics, device usage (approved studies)

Platform Integration

SkillWhat it covers
appmigrationkitCross-platform data transfer, AppMigrationExtension export/import (iOS 26)
audioaccessorykitAudio accessory features, automatic switching, device placement (iOS 26.4)
browserenginekitAlternative browser engines (EU), process management, web content extensions
callkitCXProvider, CXCallController, PushKit VoIP registration, call directory extensions
cryptotokenkitTKTokenDriver, TKSmartCard, iOS 26 NFC smart cards, certificate-based auth
energykitElectricityGuidance, EnergyVenue, grid forecasts, load event submission, electricity insights
homekitHMHomeManager, accessories, rooms, actions, triggers, MatterSupport commissioning
permissionkitAskCenter, PermissionQuestion, child communication safety, CommunicationLimits
relevancekitWidget relevance signals, time/location-based relevance providers (watchOS 26)
shareplay-activitiesGroupActivity, GroupSession, GroupSessionMessenger, coordinated media playback

Gaming

SkillWhat it covers
gamekitGame Center, GKLocalPlayer, leaderboards, achievements, real-time and turn-based multiplayer
scenekitSCNView, SCNScene, 3D geometry, materials, lighting, physics, SceneView
spritekitSKScene, SKSpriteNode, SKAction, physics simulation, particle effects, SpriteView
tabletopkitMultiplayer spatial board games, pieces, cards, dice, Group Activities (visionOS)

Structure

Each skill follows the open Agent Skills standard:

skills/
  skill-name/
    SKILL.md              # Required — instructions and metadata
    references/           # Optional — detailed reference material
      some-topic.md

SKILL.md contains YAML frontmatter (name, description) and markdown instructions. The references/ folder holds longer examples, advanced patterns, and lookup tables that the main file points to.

This repository contains original instructional content and examples for Apple platform development. Where Apple frameworks, APIs, documentation, WWDC sessions, or trademarks are referenced, those materials remain the property of Apple Inc. The license for this repository applies to this project's original content only and does not claim ownership of or relicense Apple's documentation, trademarks, sample code, or other third-party materials.

Compatibility

These skills work with any agent that supports the Agent Skills standard, including:

Upgrading from v2.x

v3.0 is a major release. If you previously installed v2.x skills, note the following changes:

  • Skill count: 57 skills in v2.2.0, 76 skills in v3.0.0.

  • Skill renames: 12 existing skills renamed to use Apple Kit framework names. Old skill paths no longer resolve. Uninstall all skills and reinstall to upgrade.

    v2.x namev3.0 name
    live-activitiesactivitykit
    mapkit-locationmapkit
    photos-camera-mediaphotokit
    homekit-matterhomekit
    callkit-voipcallkit
    metrickit-diagnosticsmetrickit
    pencilkit-drawingpencilkit
    passkit-walletpasskit
    musickit-audiomusickit
    cloudkit-synccloudkit
    eventkit-calendareventkit
    realitykit-arrealitykit
  • 19 new Kit framework skills: avkit, gamekit, cryptokit, pdfkit, paperkit, spritekit, scenekit, financekit, accessorysetupkit, adattributionkit, carplay, appmigrationkit, browserenginekit, dockkit, sensorkit, tabletopkit, relevancekit, audioaccessorykit, cryptotokenkit.

  • New bundles: apple-kit-skills (all 39 Apple Kit framework skills) and ios-gaming-skills (GameKit, SpriteKit, SceneKit, TabletopKit).

  • PaperKit standalone: PaperKit content removed from pencilkit and is now its own paperkit skill.

  • Beta frameworks: permissionkit, energykit, paperkit, relevancekit, appmigrationkit, and audioaccessorykit require iOS/watchOS 26 beta and are subject to API changes before GM.

  • All skills remain self-contained: No skill references or depends on another.

To upgrade via the skills CLI:

npx skills add dpearson2699/swift-ios-skills

To upgrade Claude Code bundles, reinstall the bundles you use (old skill paths will no longer resolve).

Support

If these skills save you time or improve your workflow, you can support ongoing maintenance through GitHub Sponsors.

Support helps keep the collection current with new Apple releases, evolving framework APIs, updated examples, and compatibility work across Claude Code, Codex, Cursor, Copilot, and other agents.

Sponsors

Thanks to the following people for supporting this project:

Anthony Jr.

License

PolyForm Perimeter 1.0.0 -- see LICENSE

What this means in practice:

  • Using these skills to build your iOS app -- allowed
  • Using these skills inside a closed-source commercial workflow -- allowed
  • Forking the repo and contributing back -- allowed
  • Sharing the skills with a teammate -- allowed
  • Taking the skills, rebranding them as "Premium iOS Agent Skills," and selling them -- not allowed (that's a competing product)

This project is not affiliated with, endorsed by, or sponsored by Apple Inc.

开发与工程内容与创作

中风险

  • 来源需自行核对维护者身份。
  • 未检测到明显脚本安装指令。
  • 未检测到明显外部权限要求。
  • 未检测到高风险命令。
  • 扫描发现:1 条。

Codex — Git Clone 安装

  1. 安装前请先查看来源仓库和风险报告。
  2. 克隆仓库:git clone https://github.com/dpearson2699/swift-ios-skills.git
  3. 将 "skills/swift-language" 文件夹复制到 Codex 的 skills 目录中。
  4. 重启 Codex 让新的 skill 生效。

Codex — 手动复制安装

  1. 安装前请先查看来源仓库和风险报告。
  2. 从源仓库下载 SKILL.md 及相关文件。
  3. 在 Codex 的 skills 目录中创建新文件夹。
  4. 将所有 skill 文件复制到新文件夹中。
  5. 重启 Codex 让新的 skill 生效。

Claude Code — Git Clone 安装

  1. 安装前请先查看来源仓库和风险报告。
  2. 克隆仓库:git clone https://github.com/dpearson2699/swift-ios-skills.git
  3. 将 "skills/swift-language" 文件夹复制到 Claude Code 的 skills 目录中。
  4. 重启 Claude Code 让新的 skill 生效。

Claude Code — 手动复制安装

  1. 安装前请先查看来源仓库和风险报告。
  2. 从源仓库下载 SKILL.md 及相关文件。
  3. 在 Claude Code 的 skills 目录中创建新文件夹。
  4. 将所有 skill 文件复制到新文件夹中。
  5. 重启 Claude Code 让新的 skill 生效。

Cursor — Git Clone 安装

  1. 安装前请先查看来源仓库和风险报告。
  2. 克隆仓库:git clone https://github.com/dpearson2699/swift-ios-skills.git
  3. 将 "skills/swift-language" 文件夹复制到 Cursor 的 skills 目录中。
  4. 重启 Cursor 让新的 skill 生效。

Cursor — 手动复制安装

  1. 安装前请先查看来源仓库和风险报告。
  2. 从源仓库下载 SKILL.md 及相关文件。
  3. 在 Cursor 的 skills 目录中创建新文件夹。
  4. 将所有 skill 文件复制到新文件夹中。
  5. 重启 Cursor 让新的 skill 生效。

GitHub Copilot — Git Clone 安装

  1. 安装前请先查看来源仓库和风险报告。
  2. 克隆仓库:git clone https://github.com/dpearson2699/swift-ios-skills.git
  3. 将 "skills/swift-language" 文件夹复制到 GitHub Copilot 的 skills 目录中。
  4. 重启 GitHub Copilot 让新的 skill 生效。

GitHub Copilot — 手动复制安装

  1. 安装前请先查看来源仓库和风险报告。
  2. 从源仓库下载 SKILL.md 及相关文件。
  3. 在 GitHub Copilot 的 skills 目录中创建新文件夹。
  4. 将所有 skill 文件复制到新文件夹中。
  5. 重启 GitHub Copilot 让新的 skill 生效。

Windsurf — Git Clone 安装

  1. 安装前请先查看来源仓库和风险报告。
  2. 克隆仓库:git clone https://github.com/dpearson2699/swift-ios-skills.git
  3. 将 "skills/swift-language" 文件夹复制到 Windsurf 的 skills 目录中。
  4. 重启 Windsurf 让新的 skill 生效。

Windsurf — 手动复制安装

  1. 安装前请先查看来源仓库和风险报告。
  2. 从源仓库下载 SKILL.md 及相关文件。
  3. 在 Windsurf 的 skills 目录中创建新文件夹。
  4. 将所有 skill 文件复制到新文件夹中。
  5. 重启 Windsurf 让新的 skill 生效。
查看 SKILL.md 原文
name: swift-language
description: "Apply modern Swift language patterns and idioms for non-concurrency, non-SwiftUI code. Covers if/switch expressions (Swift 5.9+), typed throws (Swift 6+), result builders, property wrappers, opaque and existential types (some vs any), guard patterns, Never type, Regex builders (Swift 5.7+), basic Codable shaping (CodingKeys, custom decoding, nested containers), modern collection APIs (count(where:), contains(where:), replacing()), basic FormatStyle usage, and string interpolation patterns. Use when writing core Swift code involving generics, protocols, enums, closures, or modern language features; route deep Codable to swift-codable, detailed formatting/localization to swift-formatstyle, and API naming to swift-api-design-guidelines."

Swift Language Patterns

Apply current Swift language syntax without changing behavior or evaluation order. Route deep decoding to swift-codable, formatting to swift-formatstyle, naming to swift-api-design-guidelines, concurrency to swift-concurrency, and SwiftUI state/view work to swiftui-patterns.

Contents

If/Switch Expressions

For modernization, pin current behavior and evaluation order, make one semantic rewrite, compile the affected module, and run focused fixtures/tests. Fix any change before continuing; repeat until behavior is preserved.

Swift 5.9+ allows if and switch as expressions that return values. Use them to assign, return, or initialize directly.

// Assign from if expression
let icon = if isComplete { "checkmark.circle.fill" } else { "circle" }

// Assign from switch expression
let label = switch status {
case .draft: "Draft"
case .published: "Published"
case .archived: "Archived"
}

// Works in return position
func badgeText(for priority: Priority) -> String {
    switch priority {
    case .high: "High"
    case .medium: "Medium"
    case .low: "Low"
    }
}

Rules:

  • Every branch must produce a value of the same type.
  • Multi-statement branches are not allowed -- each branch is a single expression.
  • Wrap in parentheses when used as a function argument to avoid ambiguity.

Typed Throws

Swift 6+ allows specifying the error type a function throws.

enum ValidationError: Error {
    case tooShort, invalidCharacters, alreadyTaken
}

func validate(username: String) throws(ValidationError) -> String {
    guard username.count >= 3 else { throw .tooShort }
    guard username.allSatisfy(\.isLetterOrDigit) else { throw .invalidCharacters }
    return username.lowercased()
}

// Caller gets typed error -- no cast needed
do {
    let name = try validate(username: input)
} catch {
    // error is ValidationError, not any Error
    switch error {
    case .tooShort: print("Too short")
    case .invalidCharacters: print("Invalid characters")
    case .alreadyTaken: print("Taken")
    }
}

Rules:

  • Use throws(SomeError) only when callers benefit from exhaustive error handling. For mixed error sources, use untyped throws.
  • When modernizing a helper with one local error enum, prefer throws(ErrorEnum) and note Swift 6+.
  • throws(Never) marks a function that syntactically throws but never actually does -- useful in generic contexts.
  • Typed throws propagate: a function calling throws(A) and throws(B) must itself throw a type that covers both (or use untyped throws).

Result Builders

@resultBuilder enables DSL-style syntax. SwiftUI's @ViewBuilder is the most common example, but you can create custom builders for any domain.

@resultBuilder
struct ArrayBuilder<Element> {
    static func buildBlock(_ components: [Element]...) -> [Element] {
        components.flatMap { $0 }
    }
    static func buildExpression(_ expression: Element) -> [Element] { [expression] }
    static func buildOptional(_ component: [Element]?) -> [Element] { component ?? [] }
    static func buildEither(first component: [Element]) -> [Element] { component }
    static func buildEither(second component: [Element]) -> [Element] { component }
    static func buildArray(_ components: [[Element]]) -> [Element] { components.flatMap { $0 } }
}

func makeItems(@ArrayBuilder<String> content: () -> [String]) -> [String] { content() }

let items = makeItems {
    "Always included"
    if showExtra { "Conditional" }
    for name in names { name.uppercased() }
}

Builder methods: buildBlock (combine statements), buildExpression (single value), buildOptional (if without else), buildEither (if/else), buildArray (for..in), buildFinalResult (optional post-processing).

Property Wrappers

Custom @propertyWrapper types encapsulate storage and access patterns.

@propertyWrapper
struct Clamped<Value: Comparable> {
    private var value: Value
    let range: ClosedRange<Value>

    var wrappedValue: Value {
        get { value }
        set { value = min(max(newValue, range.lowerBound), range.upperBound) }
    }

    var projectedValue: ClosedRange<Value> { range }

    init(wrappedValue: Value, _ range: ClosedRange<Value>) {
        self.range = range
        self.value = min(max(wrappedValue, range.lowerBound), range.upperBound)
    }
}

// Usage
struct Volume {
    @Clamped(0...100) var level: Int = 50
}

var v = Volume()
v.level = 150   // clamped to 100
print(v.$level) // projected value: 0...100

Design rules:

  • wrappedValue is the primary getter/setter.
  • projectedValue (accessed via $property) provides metadata or bindings.
  • Property wrappers can be composed: @A @B var x applies outer wrapper first.
  • Do not use property wrappers when a simple computed property suffices.

Opaque and Existential Types

some Protocol (Opaque Type)

The caller does not know the concrete type, but the compiler does. A -> some P return has one fixed underlying concrete type across all return branches.

func makeCollection() -> some Collection<Int> {
    [1, 2, 3]  // Always returns Array<Int> -- compiler knows the concrete type
}

Use some for:

  • Return types when you want to hide implementation but preserve type identity.
  • Parameter types (Swift 5.7+): some P is shorthand for an unnamed generic parameter such as <T: P>.

any Protocol (Existential Type)

An existential box that can hold any conforming type at runtime. It uses dynamic dispatch and may allocate when the value does not fit in the inline buffer.

func process(items: [any StringProtocol]) {
    for item in items {
        print(item.uppercased())
    }
}

When to choose

Use someUse any
Return type hiding concrete typeHeterogeneous collections
Function parameters (replaces simple generics)Dynamic type erasure needed
Better performance (static dispatch)Protocol has Self or associated type requirements you need to erase

Rule of thumb: Default to some. Use any only when you need a heterogeneous collection or runtime type flexibility.

Guard Patterns

guard enforces preconditions and enables early exit. It keeps the happy path left-aligned and reduces nesting.

func processOrder(_ order: Order?) throws -> Receipt {
    // Unwrap optionals
    guard let order else { throw OrderError.missing }

    // Validate conditions
    guard order.items.isEmpty == false else { throw OrderError.empty }
    guard order.total > 0 else { throw OrderError.invalidTotal }

    // Boolean checks
    guard order.isPaid else { throw OrderError.unpaid }

    // Pattern matching
    guard case .confirmed(let date) = order.status else {
        throw OrderError.notConfirmed
    }

    return Receipt(order: order, confirmedAt: date)
}

Best practices:

  • Use guard for preconditions, if for branching logic.
  • Combine related guards: guard let a, let b else { return }.
  • The else block must exit scope: return, throw, continue, break, or fatalError().
  • Use shorthand unwrap: guard let value else { ... } (Swift 5.7+).

Never Type

Never is an uninhabited type for code paths that never produce a value. It behaves like Swift's bottom type only where a value expression can be used or inferred; it is not a universal type witness, does not implicitly conform to arbitrary protocols, and cannot satisfy generic constraints such as T: P unless the constraint is otherwise valid for Never.

// Function that terminates the program
func crashWithDiagnostics(_ message: String) -> Never {
    let diagnostics = gatherDiagnostics()
    logger.critical("\(message): \(diagnostics)")
    fatalError(message)
}

enum Result<Success, Failure: Error> {
    case success(Success)
    case failure(Failure)
}
// Result<String, Never> -- a result that can never fail

// Exhaustive switch: no default needed since Never has no cases
func handle(_ result: Result<String, Never>) {
    switch result {
    case .success(let value): print(value)
    // No .failure case needed -- compiler knows it's impossible
    }
}

Regex Builders

Swift 5.7+ Regex builder DSL provides compile-time checked, readable patterns.

import Foundation
import RegexBuilder

// Parse "2024-03-15" into components
let dateRegex = Regex {
    Capture { /\d{4}/ }; "-"; Capture { /\d{2}/ }; "-"; Capture { /\d{2}/ }
}

if let match = "2024-03-15".firstMatch(of: dateRegex) {
    let (_, year, month, day) = match.output
    _ = (year, month, day)
}

// TryCapture with transform
let priceRegex = Regex {
    "$"
    TryCapture { OneOrMore(.digit); "."; Repeat(.digit, count: 2) }
        transform: { Decimal(string: String($0)) }
}

When to use builder vs. literal:

  • Builder: complex patterns, reusable components, strong typing on captures.
  • Literal (/pattern/): simple patterns, familiarity with regex syntax.
  • Both can be mixed: embed /.../ literals inside builder blocks.

Codable Best Practices

Use CodingKeys for simple renames and custom decoding only for real payload shape or transformation mismatches. Load extended Swift patterns for a compact language example; use swift-codable for implementation and verification.

Modern Collection APIs

Prefer these modern APIs over manual loops:

let numbers = [1, 2, 3, 4, 5, 6, 7, 8]

// count(where:) -- use instead of .filter { }.count
let evenCount = numbers.count(where: { $0.isMultiple(of: 2) })

// contains(where:) -- short-circuits on first match
let hasNegative = numbers.contains(where: { $0 < 0 })

// first(where:) / last(where:)
let firstEven = numbers.first(where: { $0.isMultiple(of: 2) })

// String replacing() -- Swift 5.7+, returns new string
let cleaned = rawText.replacing(/\s+/, with: " ")
let snakeCase = name.replacing("_", with: " ")

// compactMap -- unwrap optionals from a transform
let ids = strings.compactMap { Int($0) }

// flatMap -- flatten nested collections
let allTags = articles.flatMap(\.tags)

// Dictionary(grouping:by:)
let byCategory = Dictionary(grouping: items, by: \.category)

// reduce(into:) -- efficient accumulation
let freq = words.reduce(into: [:]) { counts, word in
    counts[word, default: 0] += 1
}

FormatStyle

Use .formatted() and Text(_:format:) for basic display. Route style selection, parsing, localization testing, and reusable formatter design to swift-formatstyle.

String Interpolation

Extend DefaultStringInterpolation for domain-specific formatting. Use """ for multi-line strings (indentation is relative to the closing """). See references/swift-patterns-extended.md for custom interpolation examples.

Common Mistakes

  1. Using any when some works. Default to some for return types and parameters, but every -> some P branch must return the same concrete type.
  2. Manual loops or .filter { }.count instead of collection APIs. Use count(where:) for conditional counts, plus contains(where:), compactMap, and flatMap instead of extra iteration or arrays.
  3. DateFormatter instead of FormatStyle. .formatted() is simpler, type-safe, and handles localization automatically.
  4. Force-unwrapping Codable decodes. Use decodeIfPresent with defaults for optional or missing keys.
  5. Reordering preconditions during modernization. Use guard without moving normalization or transformations before validation.
  6. Invalid @c signatures. Say UnsafeBufferPointer is a Swift struct/value wrapper, then reject String, Array, closures, and generic placeholders.
  7. Ignoring typed throws. When a function has a single, clear error type, typed throws give callers exhaustive switch without casting.
  8. Overusing property wrappers. A computed property is simpler when there is no reuse or projected value needed.
  9. Underspecifying Never. For Result<T, Never> or throws(Never), write the caveat explicitly: Never does not implicitly conform to arbitrary protocols, cannot satisfy arbitrary T: P constraints, and is bottom-like only in valid expression/inference contexts.
  10. Owning sibling implementation. Name the owner skill and stop. Avoid snippets for CodingKeys, decoders, formatters, SwiftUI, or concurrency.

Review Checklist

  • some used only when every opaque-return branch has one concrete type
  • guard for preconditions; count(where:) instead of manual counting or .filter { }.count
  • .formatted() used instead of DateFormatter/NumberFormatter
  • Codable types use CodingKeys for API mapping; decodeIfPresent with defaults for optional fields
  • if/switch expressions for conditional assignment; property wrappers have clear reuse justification
  • Regex builder used for complex patterns (literal OK for simple ones)
  • Typed throws used for single local error domains, with Swift 6+ compatibility noted
  • @c corrections call UnsafeBufferPointer a Swift struct/value wrapper and enumerate rejected Swift-only types by name
  • Never guidance uses uninhabited and bottom-like, and says no implicit arbitrary protocol/generic conformance
  • deep Codable to swift-codable; FormatStyle APIs to swift-formatstyle; market/localized-display QA to ios-localization; naming/concurrency/SwiftUI routed to sibling skills

References

发现问题?提交给管理员复核

评分:

评论 (0)

暂无评论,成为第一个评论者吧!