SwiftUI入门:用千问和ChatGPT生成第一个iOS打卡App

用AI(千问/ChatGPT)生成SwiftUI打卡App的实战教程与踩坑记录
本文记录了使用千问和ChatGPT分别生成iOS打卡App的完整实战过程。两个模型都能生成功能完整的代码(支持添加、勾选、删除目标及数据持久化),但都存在遗漏import Combine的通病。文章详细介绍了Xcode项目结构、MVVM架构、@main入口冲突等关键知识点,强调AI时代编程能力的核心是需求描述、代码阅读和问题调试。
课程目标:AI辅助开发你的第一个SwiftUI App
在AI时代,学习iOS开发的方式正在发生根本性变化。我们不再需要从零开始手写每一行代码,而是可以借助大语言模型快速生成可运行的应用程序。本文记录了一次使用千问(Qwen3-Max)和ChatGPT分别生成iOS打卡App的完整实战过程,适合SwiftUI零基础的开发者参考。
SwiftUI是Apple在2019年WWDC上发布的声明式UI框架,它彻底改变了iOS开发的范式。在SwiftUI之前,开发者需要使用UIKit框架通过命令式编程来构建界面——手动创建视图对象、设置约束、管理生命周期。SwiftUI采用声明式语法,开发者只需描述界面"应该是什么样子",框架会自动处理状态变化时的界面更新。这种模式与React、Flutter等现代UI框架的理念一致,大幅降低了iOS开发的入门门槛,也使得AI生成的代码更加简洁可读。
本节课的核心目标很明确:学会使用Xcode、学会用AI生成代码、了解代码结构、能够读懂部分代码并进行调试。正如作者所说——"现在是AI时代,我们不需要学会所有东西,只需要读懂部分,能够去进行调试就够了。"

需求定义:一个简单的打卡App
在向AI提需求之前,清晰的需求描述至关重要。本次的需求如下:
- 生成一个简单的iOS打卡App,使用SwiftUI开发
- 支持iOS 17即可
- 功能点:记录当天目标、勾选完成目标、删除目标、App重启后数据持久化
这个需求描述简洁但完整,涵盖了CRUD操作和数据持久化,是一个非常适合入门练手的项目。CRUD是Create(创建)、Read(读取)、Update(更新)、Delete(删除)四种基本数据操作的缩写,几乎所有应用程序的核心功能都可以归结为这四种操作的组合。在iOS开发中,数据持久化有多种实现方式:UserDefaults适合存储少量简单数据(如用户设置);Core Data是Apple提供的对象关系映射框架,适合复杂数据模型;SwiftData是2023年推出的Core Data现代替代方案。对于本文的打卡App这种轻量级场景,使用UserDefaults配合JSON编码即可满足需求。
关键技巧:保证AI输出的一致性
作者特意使用了未登录的新账户来测试千问和ChatGPT,目的是消除历史对话记忆的影响。这样做的好处是:生成的代码与学习者自行生成的代码高度一致,遇到的问题也相同,便于统一排查和解决。
千问(Qwen)是阿里云推出的大语言模型系列,Qwen3-Max是其最新的旗舰版本,在代码生成、数学推理等任务上表现突出。大语言模型生成代码的原理是基于海量代码语料的模式学习——它们在训练过程中"阅读"了GitHub上数十亿行开源代码,从而学会了各种编程语言的语法规则、API调用模式和项目结构。但这也意味着模型可能会混淆不同版本的API,或遗漏某些在实际编译中必需但在训练数据中经常被省略的导入声明。
千问生成代码:实战与踩坑
第一次生成:多文件方案的问题
千问首次生成了两个文件的方案。在Xcode中创建项目后(选择iOS → App模板,命名为"TodayToDo"),需要手动新建文件并粘贴代码。
然而,代码立即出现了报错。核心问题是:当类继承自ObservableObject时,必须手动导入Combine包。这是目前所有主流大模型(包括千问和ChatGPT)都会犯的错误。
import Combine // 这行必须手动添加
Combine是Apple在2019年推出的响应式编程框架,用于处理异步事件流和数据绑定。ObservableObject协议定义在Combine框架中,它允许一个类在其属性发生变化时自动通知所有观察者(通常是SwiftUI视图)。当一个类遵循ObservableObject协议并使用@Published属性包装器标记属性时,任何引用该对象的视图都会在属性变化时自动重新渲染。SwiftUI虽然内部依赖Combine,但在某些编译环境下,如果不显式导入Combine,编译器无法找到ObservableObject的完整定义,从而导致编译错误。这是一个Swift模块可见性的边界问题。
第二次生成:单文件方案成功
经过调整Prompt——添加"请确保代码可以正确运行"和"单文件实现"的要求后,千问生成了一个可以正常工作的版本。最终效果:
- ✅ 可以添加目标(如"看书30分钟")
- ✅ 可以点击勾选完成
- ✅ 左右滑动可以删除
- ✅ 退出App重新打开,数据依然保留
ChatGPT生成代码:对比体验
ChatGPT生成了三个文件的方案:模型类(Model)、视图模型(ViewModel)和主视图(ContentView)。代码结构更加规范,但同样遇到了两个问题:
- Combine包未导入——和千问一样的老问题
- 重复的App入口——ChatGPT额外生成了一个
@main标记的App结构体,与项目已有的入口冲突,需要删除
ChatGPT生成的三文件方案遵循的是MVVM(Model-View-ViewModel)架构模式。Model层定义数据结构(如待办事项的ID、标题、完成状态),ViewModel层处理业务逻辑和状态管理(如添加、删除、持久化操作),View层负责界面展示。这种分层架构的优势在于关注点分离——每个文件只负责一个职责,便于测试和维护。相比之下,千问的单文件方案虽然更适合快速原型开发和学习,但在项目规模增长后会变得难以维护。MVVM是SwiftUI开发中最主流的架构选择,因为SwiftUI的数据绑定机制天然适配ViewModel模式。
关于@main入口冲突问题:在Swift 5.3中引入的@main属性标记用于指定应用程序的入口点。一个Swift应用只能有一个@main标记的结构体或类,它相当于传统编程中的main()函数。当使用Xcode创建新项目时,模板会自动生成一个带有@main标记的App结构体文件。如果AI生成的代码中也包含一个@main入口,就会出现"multiple entry points"编译错误。解决方法是删除AI生成的入口文件,保留Xcode模板生成的那个,并将AI生成的ContentView设置为WindowGroup中的根视图。
解决这两个问题后,ChatGPT版本同样成功运行,功能与千问版本一致。
Xcode项目结构速览
对于初次接触Xcode的开发者,了解以下基本结构很重要:
- 左侧面板:文件导航区,管理所有代码文件
- 中间区域:代码编辑区
- 右侧面板:属性检查器和Canvas实时预览
- App文件:整个应用的入口,
WindowGroup中包裹的就是首页 - ContentView:默认的主视图文件
实用操作技巧:
- 按住Command点击组件可以跳转到定义
- 点击UI组件会弹出属性面板,可以可视化修改字体、大小等
- 模拟器截图:点击屏幕后按
Command + S - 模拟器退出App:在黑边区域向上滑动
必须记住的一个坑:import Combine
当代码中使用了ObservableObject协议时,必须手动添加import Combine。 这是目前所有主流大模型都会遗漏的导入声明。如果不知道这个问题,你可能会在AI的引导下兜圈子很久都无法解决编译错误。
这个问题的根本原因是ObservableObject协议定义在Combine框架中,而大模型在生成代码时往往只导入SwiftUI(SwiftUI内部会间接引用Combine的部分功能,但不足以覆盖所有场景)。值得注意的是,在iOS 17及以上版本中,Apple引入了新的@Observable宏(基于Observation框架),它不再依赖Combine,可以直接在SwiftUI中使用而无需额外导入。如果你的项目最低支持iOS 17,可以考虑使用@Observable替代ObservableObject来彻底规避这个问题。但由于大量现有教程和代码仍使用ObservableObject模式,了解这个坑依然非常必要。
下一步学习建议
- 自己动手:用AI生成一个简单App,亲自体验从需求到运行的完整流程
- 逐步加功能:如果第一个App顺利跑起来,可以让AI添加历史记录查看、多日目标管理等功能
- 跟做官方教程:Apple官方的SwiftUI教程(Landmarks项目)是必做的学习资源,包含4个大章节,从基础UI到动画、WatchOS适配都有覆盖
官方教程要求Xcode 15以上版本,基本需要2016年之后的Mac才能支持。教程中每个小节都提供了Complete文件夹作为参考答案,遇到问题时可以对照检查。
总结
用AI生成SwiftUI代码已经是一个非常可行的学习和开发路径。千问和ChatGPT都能生成功能完整的打卡App,但都存在Combine包遗漏的通病。掌握这个关键知识点后,AI辅助iOS开发的体验会顺畅很多。对于国内开发者,如果只能使用国内模型,千问在编码方面的表现值得推荐。
从更宏观的角度看,AI辅助编程正在重新定义"会编程"的含义。传统的编程学习强调语法记忆和从零构建的能力,而AI时代的编程能力更侧重于:能否清晰地描述需求、能否读懂生成的代码、能否定位和修复问题。这种转变使得非计算机专业的人也能快速构建可用的应用程序,极大地降低了软件开发的门槛。
相关推荐
教程攻略Cursor+Codex双IDE协同:开源项目二开实战方法论
基于实战经验总结的开源项目二次开发完整方法论,详解Cursor+Codex双IDE协同工作流,涵盖二开七环节、MVP验证、AI读源码技巧,帮助开发者三天跑通项目、两周完成业务集成。
教程攻略Cursor多Agent实战:50分钟搭建Next.js全栈博客
使用Cursor IDE多Agent协作模式,50分钟内从零搭建全栈博客。涵盖Next.js、Clerk认证、Supabase数据库集成,详解4个AI Agent分阶段开发流程与关键避坑经验。
教程攻略从零搭建AI软件工厂:Cursor工程师的多Agent协作实战经验
Cursor工程师Eric分享AI软件工厂构建实战:从自动化六层级、护栏设计、并行Agent管理到规模化扩展,详解如何用多Agent协作实现7×24小时高效软件开发。