Swift iOS 是一套面向 iOS 和 iPadOS 上 SwiftUI 应用的工程规范技能。它规定每次改动都要遵守的规则,具体细节放在 references 目录下的各类参考文档中;建议只阅读与当前任务相关的那部分。
【使用前提】 动手前先读项目设置:部署目标(.pbxproj 中的 IPHONEOS_DEPLOYMENT_TARGET、Package.swift 中的 platforms:)、Swift 语言模式、默认 actor 隔离(SWIFT_DEFAULT_ACTOR_ISOLATION,或 swiftSettings 中的 .defaultIsolation(MainActor.self))以及严格并发级别。这些信息未知时,相关建议都不可靠;同时保持既有部署目标,不要为了使用某 API 而抬高它。还要阅读邻近代码,其架构、目录布局和命名优先于本技能的默认做法;若代码库已使用 view model,就继续新增 view model。调用某 API 前若想判断它是“新”还是“实验性”,先查 references/platform-facts.md,该文件是本技能唯一给出 OS、Xcode、Swift 当前版本的地方。
【运行规则】 架构上采用 MV:视图用 @State 持有 UI 状态,应用逻辑放在 @Observable 模型和服务中,并通过环境或初始化器注入;除非 references/views-and-state.md 列出的例外情形适用,或代码库已在用 view model,否则不添加逐屏 view model。@MainActor 的使用要跟随项目隔离配置:在 MainActor 默认目标中不标注;其他情况下 UI 状态的 @Observable 模型标 @MainActor,非 UI 服务(网络、解析、持久化)保持非隔离。不得为消除诊断而加 @MainActor、@unchecked Sendable、nonisolated(unsafe) 或 @preconcurrency,而应查找隔离缺陷。对于任务触及的代码,替换硬弃用 API,对软弃用 API 只做标记(deprecated: 100000.0,保持构建安静)而不重写;新代码不得引入任何弃用 API,也不扫描任务未触及的视图。比部署目标更新的 API 必须用 #available 加有效回退,并匹配项目的 Xcode 版本。Liquid Glass 方面,保留系统组件自带的玻璃效果,不要用不透明工具栏或标签栏背景对抗它,也不要在未经要求时手写 glassEffect 或自定义玻璃。性能上始终应用 references/performance.md 中的日常规则,只有出现已诊断问题或被要求深度性能评审时才做结构性优化。优先 SwiftUI,除非只能通过桥接用 UIKit;添加第三方依赖前先询问;每个文件只放一个主要类型,目录按功能分组。
【正确性清单】 以下违规视为 Bug:@State 与 @FocusState 应为 private,父级拥有的输入不得复制进 @State;新代码用 @Observable 而不是 ObservableObject,@State 持有它,需要绑定的注入模型用 @Bindable;@Binding 只用于子视图写父状态;body 中不得使用 Binding(get:set:);ForEach 标识必须稳定,可变值不得用 .indices 或 .self,每个元素一个视图;可点击元素用带文字标签的 Button(图标按钮用 Button("Add", systemImage:)),而非 onTapGesture;动画用 .animation(_:value:);新代码用 foregroundStyle 而非 foregroundColor;环境 @Entry 的默认值必须稳定,不能是 Model()、Date() 或 UUID();新代码不用 GCD,等待用 Task.sleep(for:);ModelContext 与 @Model 实例不得跨 actor,传 PersistentIdentifier;版本相关 API 由 #available 把关并提供回退;预览使用内存内自包含数据,不联网、不用实库。
【参考文档索引】 属性包装器、数据流、@Observable 模型、环境、视图拆分、修饰符顺序、异步加载状态与预览,见 views-and-state.md;NavigationStack/NavigationSplitView、路由、sheet、alert、对话框、标签页、工具栏、搜索与深链,见 navigation.md;栈、网格、列表、表单、滚动视图、安全区、尺寸类、iPad 多任务与折叠屏,见 layout.md;API 是否弃用及其替代、现代 Swift 惯用法,见 modern-api.md;VoiceOver、动态字体、减弱动态效果、本地化、文本格式化、HIG、主题与触感,见 accessibility-and-text.md;隐式/显式动画、转场、matched geometry、阶段与关键帧动画,见 animation.md;列表慢、滚动卡顿、body 求值过多、图片解码与性能评审,见 performance.md;async/await、actor、Task、取消、Sendable 错误、Swift 6 迁移与回调桥接,见 concurrency.md;@Model、@Query、谓词、关系、索引、CloudKit 同步与 ModelActor,见 swiftdata.md;iOS 26+ 的工具栏、标签栏、自定义控件与 glassEffect 请求,见 liquid-glass.md;当前 OS、Xcode 与 Swift 版本及新设备,见 platform-facts.md;编写或审查测试时,若已安装 swift-testing 技能则一并使用。
【不覆盖范围】 macOS 场景、窗口与视图;Swift Charts;WebKit;文档型应用;富文本编辑;焦点管理;Instruments 录制与分析;Core Data。
【功能开发与评审的区别】 做功能或修 Bug 时,只做这次改动就停,不重写无关代码;若改动的代码用了软弃用 API,可在结尾用一行提示迁移。被要求评审时,只报告真实问题并按文件分组:给出文件与行号、用一行点明违反的规则(如“使用 foregroundStyle() 而非 foregroundColor()”)、简短的前后修复对比;无问题的文件跳过;最后给出按影响排序的摘要,每项标注所属领域与严重程度(如“无障碍(高):添加按钮没有标签”)。全应用评审时先选重点领域,再逐个处理。