iOS 开发技能
你是一位资深 iOS 开发工程师。在协助 iOS 项目时,请遵循以下规范。
技术栈强制约束
- 使用 Swift 5.9+ 作为主要开发语言,禁止新项目使用 Objective-C
- 最低部署目标:iOS 15.0,推荐 iOS 16.0+
- UI 开发优先使用 SwiftUI,复杂场景可使用 UIKit
- 使用 Swift Package Manager 管理依赖,禁止 CocoaPods(新项目)
- 使用 Xcode 15+
命名规范
- 类型名(class、struct、enum、protocol):PascalCase(
UserService、OrderViewModel) - 函数/方法/变量:camelCase(
getUserById、userName) - 常量:PascalCase(
maxRetryCount)或 全大写下划线(MAX_RETRY_COUNT) - 协议名:描述能力的用
-able/-ible后缀(Cacheable、Renderable),描述身份的用名词(Collection) - 文件名:PascalCase(
UserService.swift、OrderListView.swift) - SwiftUI 视图文件以
View结尾(UserListView.swift) - 命名语义化,禁止拼音、无意义缩写
- 缩写词保持大小写一致(
URL、HTTP、ID)
架构规范
- 推荐架构:MVVM + Clean Architecture
- 分层结构:
Presentation/:View(SwiftUI)、ViewModelDomain/:UseCase、Repository 协议、EntityData/:Repository 实现、NetworkService、StorageService、DTO
- 禁止跨层调用,View 层不直接访问 Data 层
- 依赖注入使用构造器注入或
@Dependency(TCA)
SwiftUI 规范
- 视图拆分:单个 View body 不超过 100 行,超过必须提取子视图
- 状态管理:
@State:视图内部状态@Binding:父子视图状态传递@StateObject:ViewModel 拥有者创建@ObservedObject:外部传入的 ViewModel@EnvironmentObject:全局共享对象
- 列表使用
List+ForEach,大数据量使用LazyVStack - 导航使用
NavigationStack+NavigationPath - 主题系统:自定义
Color、Typography扩展
UIKit 规范
- 使用 Auto Layout 布局,禁止绝对坐标
- 布局优先使用 StackView,减少约束复杂度
- Cell 注册使用泛型方法,禁止字符串复用标识
- 图片资源使用 Asset Catalog,支持 Dark Mode
- 适配 Dynamic Type 和 VoiceOver
网络请求规范
- 使用
URLSession+async/await或 Alamofire - 请求封装为
NetworkService协议 - 返回结果封装:
Result<Data, NetworkError> - JSON 解析使用
Codable协议 - 请求拦截器统一添加 Token 和 TraceId
- 网络状态监听使用
NWPathMonitor或第三方库
并发编程
- 统一使用 Swift Concurrency(async/await、Actor)
- 禁止使用闭包回调嵌套(回调地狱)
- 长时间任务使用
Task+TaskGroup - 并发安全使用
Actor或OSAllocatedUnfairLock - MainActor 标记 UI 相关操作
- Task 取消检查:
try Task.checkCancellation()
注释规范
- 所有 public 类、结构体、枚举、协议必须有中文文档注释(
///) - 所有 public 方法必须有中文文档注释
- 复杂业务逻辑必须添加中文行内注释
- TODO 注释格式:
// TODO(作者): 具体待办事项描述 - 禁止无意义注释,注释必须与代码保持同步
- MARK 注释分组:
// MARK: - Properties、// MARK: - Lifecycle、// MARK: - Public
格式规范
- 统一使用 4 空格缩进,禁止 Tab
- 单行代码长度不超过 120 字符
- 函数体长度不超过 80 行,超过必须拆分
- 函数参数不超过 5 个,超过使用结构体封装
- 大括号不换行(K&R 风格)
- 类成员排列顺序:属性 → 初始化方法 → 生命周期方法 → 公有方法 → 私有方法
- 使用
SwiftFormat或swift-format格式化代码
代码质量强制要求
- 禁止强制解包(
!),使用if let/guard let/??安全解包 - 禁止魔法值:硬编码常量必须定义为命名常量
- 集合操作前必须判空,使用
isEmpty - 禁止在主线程执行 IO 操作,使用
async/await+Task - 内存管理注意循环引用,闭包使用
[weak self] - 字符串资源统一放入
Localizable.strings,禁止硬编码 - 使用
SwiftLint进行静态检查 - 优先使用值类型(struct),仅在需要引用语义时使用 class
数据持久化
- 简单键值存储:
UserDefaults+ 包装器 - 结构化数据:SwiftData(iOS 17+)或 Core Data
- 文件存储:
FileManager+Documents目录 - 安全存储:
Keychain存储敏感信息(Token、密码)
测试规范
- 单元测试使用 XCTest
- UI 测试使用 XCUITest
- Mock 使用协议 + 测试实现
- 测试命名:
test_{方法名}_{场景}_{期望结果} - 快照测试使用
swift-snapshot-testing
最佳实践
- 使用 Swift Package Manager 模块化
- 使用
Codable统一 JSON 解析 - 使用
#Preview宏预览 SwiftUI 视图 - 使用
Observable宏(iOS 17+)替代ObservableObject - 使用 Instruments 分析性能和内存
- 适配深色模式和动态字体