Swift模式
Mattakushi4322026-10-26查看 1744复制 1309
何时激活:通用 Swift 代码、值类型、枚举、模式匹配、选项、结果类型、属性包装器
📘如何使用这个技能
- 1复制技能内容·点击上方「Copy SKILL.md」复制全部内容,或 Download 下载到本地
- 2打开你的 AI 客户端·支持 Claude Code、Trae、Cursor、ChatGPT、DeepSeek、Kimi 等任意 AI 助手
- 3粘贴为系统提示/知识文件·Claude Code:放入 .claude/skills/ 目录;普通对话:作为首条消息发送并说「请严格按这份技能文档执行」
- 4直接提出你的需求·AI 会按技能定义的工作流、格式和约束来处理,无需再解释背景
💡 提示:技能生效后,每次对话只需一句需求,AI 会按 SKILL.md 的流程执行。
SKILL.md3992 chars
---
name: swift-patterns
description: "When to activate: general Swift code, value types, enums, pattern matching, optionals, result types, property wrappers"
origin: zakr
metadata:
namespace: zakr/devtools-pack
version: 1.0.0
category: engineering
language: swift
platforms: [claude-code, codex, gemini-cli, cursor, aider, windsurf]
---
# Swift Patterns
## Value Types First
Prefer structs and enums over classes unless you need reference semantics.
```swift
// Good — value type, copyable, predictable
struct Point {
var x: Double
var y: Double
func distance(to other: Point) -> Double {
sqrt(pow(x - other.x, 2) + pow(y - other.y, 2))
}
}
// Only use class when you need shared mutable state or ObjC interop
final class UserSession {
private(set) var token: String
init(token: String) { self.token = token }
}
```
## Enums with Associated Values
Model domain states exhaustively — never use stringly-typed sentinels.
```swift
enum AuthState {
case unauthenticated
case authenticating
case authenticated(User)
case failed(AuthError)
}
func handle(_ state: AuthState) {
switch state {
case .unauthenticated: showLogin()
case .authenticating: showSpinner()
case .authenticated(let u): showDashboard(user: u)
case .failed(let e): showError(e)
}
}
```
## Optionals
```swift
// Use guard for early exit
func process(input: String?) -> String {
guard let value = input, !value.isEmpty else { return "" }
return value.uppercased()
}
// map/flatMap on Optional avoids repeated unwrapping
let length = name?.count
let trimmed = name?.trimmingCharacters(in: .whitespaces)
// Force unwrap only for known-safe static values
let url = URL(string: "https://api.example.com")!
```
## Result Type
```swift
enum NetworkError: Error {
case invalidURL, timeout, serverError(Int), decodingFailed
}
func fetch<T: Decodable>(url: URL) async -> Result<T, NetworkError> {
do {
let (data, response) = try await URLSession.shared.data(from: url)
guard let http = response as? HTTPURLResponse, http.statusCode == 200 else {
return .failure(.serverError((response as? HTTPURLResponse)?.statusCode ?? 0))
}
return .success(try JSONDecoder().decode(T.self, from: data))
} catch is DecodingError {
return .failure(.decodingFailed)
} catch {
return .failure(.timeout)
}
}
```
## Property Wrappers
```swift
@propertyWrapper
struct Clamped<T: Comparable> {
private var value: T
let range: ClosedRange<T>
init(wrappedValue: T, _ range: ClosedRange<T>) {
self.range = range
self.value = min(max(wrappedValue, range.lowerBound), range.upperBound)
}
var wrappedValue: T {
get { value }
set { value = min(max(newValue, range.lowerBound), range.upperBound) }
}
}
struct Player {
@Clamped(0...100) var health: Int = 100
@Clamped(0...1) var speed: Double = 0.5
}
```
## Pattern Matching
```swift
// if case let for single-case matching
if case .authenticated(let user) = authState {
print("Logged in as \(user.name)")
}
// for-case in collections
let errors = results.compactMap {
if case .failure(let e) = $0 { return e } else { return nil }
}
// switch with where clauses
switch response.statusCode {
case 200..<300: handleSuccess(data)
case 400 where debug: log("Bad request: \(response)")
case 400..<500: handleClientError(response.statusCode)
case 500...: handleServerError(response.statusCode)
default: break
}
```
## Common Anti-Patterns
- **Force unwrap `!`** in production — use `guard let` or `if let`
- **Classes for pure data** — structs are thread-safe by default
- **Stringly-typed state** — model with enums and associated values
- **Ignoring `Result`** — propagate errors; avoid sentinel `nil` returns
- **`@objc` everywhere** — annotate only what ObjC actually needs