这个 Swift 贪吃蛇系列做到这里,开始进入更细的 UI 实现阶段。相比一味堆代码,这一节更值得关注的是两个能立刻改善代码质量的小技巧:如何把不同格子的显示逻辑收进 enum,以及如何用 #imageLiteral 更直观地管理图片资源。看完后,你可以判断哪些逻辑适合封装进类型本身,哪些资源引用方式更适合自己的小型项目。
项目背景与参考地址
这个项目面向 Swift 初学者,目标是从零做出一个简单的贪吃蛇小游戏。原文也给出了两个参考仓库,便于对照完整实现继续阅读:
- 完整 Demo:RickeyBoy/SnakeGame
- 笔记合集:RickeyBoy/Rickey-iOS-Notes
这一篇不涉及复杂算法,重点在于让 UI 代码更清楚、更容易维护。
把单元格显示逻辑封装进 enum
在 Swift 里,enum 不只是“列出几种状态”这么简单。它本身就可以带方法、实现协议,甚至作为一段业务逻辑的天然边界。对于贪吃蛇这种由不同格子状态组成的小游戏来说,用枚举来管理显示逻辑是很合适的做法。

UnitViewType 负责什么
UnitViewType 用来表示游戏网格里不同单元格的类型。原文给出的思路是,为它增加一个 generateImage 方法,让每种类型自己决定该显示什么图片,而不是把判断逻辑散落在视图层。
对应关系很直接:
- 蛇头(
snakeHead)展示绿色菱形 - 蛇身(
snakeBody)展示浅蓝色圆形 - 食物(
food)随机展示一张食物图片 - 空白格子(
normal)什么都不展示
为什么这种写法更省事
把图片生成逻辑放进 UnitViewType 内部后,外部代码只需要根据当前类型直接调用方法,不必再写一长串判断。这样做至少有三个实际好处:
- 显示规则集中在一个地方,后续改样式时更容易定位
- 视图层只负责使用结果,不必关心细节实现
- 条件分支减少后,代码可读性会明显提升
对初学者来说,这也是理解“类型本身承载行为”的一个很好的练习。
Swift enum 还能继续怎么用
原文顺带提到,Swift 中的 enum 远不止这个用途,后续项目里也经常会用到这些能力:
- 定义关联值(Associated Values):为每个
case携带不同类型的数据 - 实现协议(Protocol Conformance):让
enum遵循Codable、Equatable等协议 - 扩展功能(Extensions):补充方法或计算属性
- 使用泛型(Generics):提升通用性
如果你正在写的是状态驱动明显的小项目,优先考虑用 enum 建模,通常会比零散的常量和分支判断更整洁。
通过 #imageLiteral 直接引用图片资源
第二个技巧更偏向开发体验优化。Swift 支持在代码中直接插入图片资源引用,这样在处理 UI 时会比纯字符串名称更直观。

#imageLiteral 的作用是什么
原文提到,代码里之所以能直接看到图片引用效果,关键就在于 #imageLiteral。使用这个关键字后,图片资源可以以更可视化的方式出现在代码编辑过程中,阅读和修改都会更方便。
对于经常要切换图片、微调界面元素的小项目,这种写法能减少来回查找资源文件的时间。
它适合什么场景
作者给出的建议很明确:在小型项目里,强烈建议采用 #imageLiteral。主要原因包括:
- 代码里直接引用图片资源,更直观
- 可读性更好,尤其适合 UI 练习项目
- 减少手动输入资源名带来的查找成本
- 也能避免因资源名称写错引发的问题
当然,如果项目规模继续变大,资源管理方式还需要结合团队规范、组件化方式和可维护性一并考虑;但在入门练习阶段,这确实是很顺手的技巧。
这一节能带走什么
这一期虽然只讲了两个小点,但都很贴近日常 Swift 开发:
- 用
enum+ 方法封装状态对应的显示逻辑,让代码更聚合 - 用
#imageLiteral提升图片资源引用的直观性
如果你也在做类似的 UI 练习项目,可以先从这两个地方下手整理代码。下一步继续完善界面时,这样的结构会比把判断和资源引用都堆在控制器里更轻松。
按原系列进度,下一期会继续完善 UI 部分代码。







