mirror of
https://github.com/affaan-m/everything-claude-code.git
synced 2026-04-09 19:03:28 +08:00
docs(zh-CN): sync Chinese docs with latest upstream changes (#304)
* docs(zh-CN): sync Chinese docs with latest upstream changes * update --------- Co-authored-by: neo <neo.dowithless@gmail.com>
This commit is contained in:
48
docs/zh-CN/rules/swift/coding-style.md
Normal file
48
docs/zh-CN/rules/swift/coding-style.md
Normal file
@@ -0,0 +1,48 @@
|
||||
---
|
||||
paths:
|
||||
- "**/*.swift"
|
||||
- "**/Package.swift"
|
||||
---
|
||||
|
||||
# Swift 编码风格
|
||||
|
||||
> 本文件在 [common/coding-style.md](../common/coding-style.md) 的基础上扩展了 Swift 相关的内容。
|
||||
|
||||
## 格式化
|
||||
|
||||
* **SwiftFormat** 用于自动格式化,**SwiftLint** 用于风格检查
|
||||
* `swift-format` 已作为替代方案捆绑在 Xcode 16+ 中
|
||||
|
||||
## 不变性
|
||||
|
||||
* 优先使用 `let` 而非 `var` — 将所有内容定义为 `let`,仅在编译器要求时才改为 `var`
|
||||
* 默认使用具有值语义的 `struct`;仅在需要标识或引用语义时才使用 `class`
|
||||
|
||||
## 命名
|
||||
|
||||
遵循 [Apple API 设计指南](https://www.swift.org/documentation/api-design-guidelines/):
|
||||
|
||||
* 在使用时保持清晰 — 省略不必要的词语
|
||||
* 根据方法和属性的作用而非类型来命名
|
||||
* 对于常量,使用 `static let` 而非全局常量
|
||||
|
||||
## 错误处理
|
||||
|
||||
使用类型化 throws (Swift 6+) 和模式匹配:
|
||||
|
||||
```swift
|
||||
func load(id: String) throws(LoadError) -> Item {
|
||||
guard let data = try? read(from: path) else {
|
||||
throw .fileNotFound(id)
|
||||
}
|
||||
return try decode(data)
|
||||
}
|
||||
```
|
||||
|
||||
## 并发
|
||||
|
||||
启用 Swift 6 严格并发检查。优先使用:
|
||||
|
||||
* `Sendable` 值类型用于跨越隔离边界的数据
|
||||
* Actors 用于共享可变状态
|
||||
* 结构化并发 (`async let`, `TaskGroup`) 而非非结构化的 `Task {}`
|
||||
21
docs/zh-CN/rules/swift/hooks.md
Normal file
21
docs/zh-CN/rules/swift/hooks.md
Normal file
@@ -0,0 +1,21 @@
|
||||
---
|
||||
paths:
|
||||
- "**/*.swift"
|
||||
- "**/Package.swift"
|
||||
---
|
||||
|
||||
# Swift 钩子
|
||||
|
||||
> 此文件扩展了 [common/hooks.md](../common/hooks.md) 的内容,添加了 Swift 特定内容。
|
||||
|
||||
## PostToolUse 钩子
|
||||
|
||||
在 `~/.claude/settings.json` 中配置:
|
||||
|
||||
* **SwiftFormat**: 在编辑后自动格式化 `.swift` 文件
|
||||
* **SwiftLint**: 在编辑 `.swift` 文件后运行代码检查
|
||||
* **swift build**: 在编辑后对修改的包进行类型检查
|
||||
|
||||
## 警告
|
||||
|
||||
标记 `print()` 语句 — 在生产代码中请改用 `os.Logger` 或结构化日志记录。
|
||||
67
docs/zh-CN/rules/swift/patterns.md
Normal file
67
docs/zh-CN/rules/swift/patterns.md
Normal file
@@ -0,0 +1,67 @@
|
||||
---
|
||||
paths:
|
||||
- "**/*.swift"
|
||||
- "**/Package.swift"
|
||||
---
|
||||
|
||||
# Swift 模式
|
||||
|
||||
> 此文件使用 Swift 特定内容扩展了 [common/patterns.md](../common/patterns.md)。
|
||||
|
||||
## 面向协议的设计
|
||||
|
||||
定义小型、专注的协议。使用协议扩展来提供共享的默认实现:
|
||||
|
||||
```swift
|
||||
protocol Repository: Sendable {
|
||||
associatedtype Item: Identifiable & Sendable
|
||||
func find(by id: Item.ID) async throws -> Item?
|
||||
func save(_ item: Item) async throws
|
||||
}
|
||||
```
|
||||
|
||||
## 值类型
|
||||
|
||||
* 使用结构体(struct)作为数据传输对象和模型
|
||||
* 使用带有关联值的枚举(enum)来建模不同的状态:
|
||||
|
||||
```swift
|
||||
enum LoadState<T: Sendable>: Sendable {
|
||||
case idle
|
||||
case loading
|
||||
case loaded(T)
|
||||
case failed(Error)
|
||||
}
|
||||
```
|
||||
|
||||
## Actor 模式
|
||||
|
||||
使用 actor 来处理共享可变状态,而不是锁或调度队列:
|
||||
|
||||
```swift
|
||||
actor Cache<Key: Hashable & Sendable, Value: Sendable> {
|
||||
private var storage: [Key: Value] = [:]
|
||||
|
||||
func get(_ key: Key) -> Value? { storage[key] }
|
||||
func set(_ key: Key, value: Value) { storage[key] = value }
|
||||
}
|
||||
```
|
||||
|
||||
## 依赖注入
|
||||
|
||||
使用默认参数注入协议 —— 生产环境使用默认值,测试时注入模拟对象:
|
||||
|
||||
```swift
|
||||
struct UserService {
|
||||
private let repository: any UserRepository
|
||||
|
||||
init(repository: any UserRepository = DefaultUserRepository()) {
|
||||
self.repository = repository
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 参考
|
||||
|
||||
查看技能:`swift-actor-persistence` 以了解基于 actor 的持久化模式。
|
||||
查看技能:`swift-protocol-di-testing` 以了解基于协议的依赖注入和测试。
|
||||
34
docs/zh-CN/rules/swift/security.md
Normal file
34
docs/zh-CN/rules/swift/security.md
Normal file
@@ -0,0 +1,34 @@
|
||||
---
|
||||
paths:
|
||||
- "**/*.swift"
|
||||
- "**/Package.swift"
|
||||
---
|
||||
|
||||
# Swift 安全
|
||||
|
||||
> 此文件扩展了 [common/security.md](../common/security.md),并包含 Swift 特定的内容。
|
||||
|
||||
## 密钥管理
|
||||
|
||||
* 使用 **Keychain Services** 处理敏感数据(令牌、密码、密钥)—— 切勿使用 `UserDefaults`
|
||||
* 使用环境变量或 `.xcconfig` 文件来管理构建时的密钥
|
||||
* 切勿在源代码中硬编码密钥 —— 反编译工具可以轻易提取它们
|
||||
|
||||
```swift
|
||||
let apiKey = ProcessInfo.processInfo.environment["API_KEY"]
|
||||
guard let apiKey, !apiKey.isEmpty else {
|
||||
fatalError("API_KEY not configured")
|
||||
}
|
||||
```
|
||||
|
||||
## 传输安全
|
||||
|
||||
* 默认强制执行 App Transport Security (ATS) —— 不要禁用它
|
||||
* 对关键端点使用证书锁定
|
||||
* 验证所有服务器证书
|
||||
|
||||
## 输入验证
|
||||
|
||||
* 在显示之前清理所有用户输入,以防止注入攻击
|
||||
* 使用带验证的 `URL(string:)`,而不是强制解包
|
||||
* 在处理来自外部源(API、深度链接、剪贴板)的数据之前,先进行验证
|
||||
46
docs/zh-CN/rules/swift/testing.md
Normal file
46
docs/zh-CN/rules/swift/testing.md
Normal file
@@ -0,0 +1,46 @@
|
||||
---
|
||||
paths:
|
||||
- "**/*.swift"
|
||||
- "**/Package.swift"
|
||||
---
|
||||
|
||||
# Swift 测试
|
||||
|
||||
> 本文档在 [common/testing.md](../common/testing.md) 的基础上扩展了 Swift 特定的内容。
|
||||
|
||||
## 框架
|
||||
|
||||
对于新测试,使用 **Swift Testing** (`import Testing`)。使用 `@Test` 和 `#expect`:
|
||||
|
||||
```swift
|
||||
@Test("User creation validates email")
|
||||
func userCreationValidatesEmail() throws {
|
||||
#expect(throws: ValidationError.invalidEmail) {
|
||||
try User(email: "not-an-email")
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 测试隔离
|
||||
|
||||
每个测试都会获得一个全新的实例 —— 在 `init` 中设置,在 `deinit` 中拆卸。测试之间没有共享的可变状态。
|
||||
|
||||
## 参数化测试
|
||||
|
||||
```swift
|
||||
@Test("Validates formats", arguments: ["json", "xml", "csv"])
|
||||
func validatesFormat(format: String) throws {
|
||||
let parser = try Parser(format: format)
|
||||
#expect(parser.isValid)
|
||||
}
|
||||
```
|
||||
|
||||
## 覆盖率
|
||||
|
||||
```bash
|
||||
swift test --enable-code-coverage
|
||||
```
|
||||
|
||||
## 参考
|
||||
|
||||
关于基于协议的依赖注入和 Swift Testing 的模拟模式,请参阅技能:`swift-protocol-di-testing`。
|
||||
Reference in New Issue
Block a user