本项目是用于 Swift 初学者的一个教学练习项目,我们最终的目的是基于 Swift 做出下面这样的一个贪吃蛇小游戏。
完整 Demo 地址:RickeyBoy/SnakeGame
我的笔记文章合集地址:RickeyBoy/Rickey-iOS-Notes
如果大家感兴趣,欢迎点赞收藏~
第二步:写 UI 相关的代码
步骤 1:UI 代码框架搭建
接下来我们先写 UI 相关的代码,也就是 Layout 文件夹中的部分
最终会需要新建这么三个文件:
- GameView:游戏区域
- UnitView:游戏区域中每个单位小格子
- LogView:上方的信息展示区域
用最终的截图来展示的话就能很一目了然了:
步骤 2:详细讲解 UnitView
对于每一个小方格而言,核心会有两个属性。
首先会必须要有一个坐标的概念,代表他所处的具体的位置。
其次,一个小格子一共有四种展示情况,这四种情况分别展示不同的图片样式:
- 蛇头:展示绿色菱形
- 蛇身:展示绿色圆形
- 食物:展示星星
- 空白格子:不展示任何图片
这里我们根据需要,可以判断样式需要使用 enum
/// UnitView 类型
enum UnitViewType {
case snakeHead /// 蛇头
case snakeBody /// 蛇身
case food /// 食物
case normal /// 空白格子
}
而坐标需要使用使用 struct 来定义:
/// 坐标
struct Pos {
var x: Int
var y: Int
}
所以 UnitView 的情况是(简化版):
知识点:Swift 中的结构体和枚举
这里穿插讲一个刚才涉及到的知识点。我们可以注意到刚才的代码中,UnitView 类型使用的是enum 枚举类型,而坐标 Pos 使用的是 struct 结构体。那这两个类型有什么异同呢?
在 Swift 中,除了我们最熟悉的 Class 之外,struct 和 enum 这两种类型也经常被使用:
- struct (结构体) :用于定义自定义数据类型,可以包含多个属性和方法。结构体是值类型。
- enum (枚举) :用于定义一个有固定数量的常量集合,可以有原始值,也可以关联值。枚举可以定义方法。
特性 | struct | enum |
---|---|---|
类型 | 自定义数据类型 | 固定数量的常量集合 |
存储 | 值类型 | 值类型(默认)或引用类型(如果定义为 class) |
属性 | 可以有多个属性 | 通常没有属性,但可以扩展 |
方法 | 可以定义方法 | 可以定义方法 |
原始值 | 不适用 | 可以有,用于存储额外信息 |
关联值 | 不适用 | 可以有,每个枚举案例可以关联不同的数据类型 |
继承 | 不能被继承 | 不能被继承 |
构造器 | 可以有构造器 | 可以有构造器 |
Swift 中的 enum
可以非常强大,可以拥有方法、原始值和关联值,使它们在某些情况下可以替代 struct
。然而,struct
由于是引用类型,通常用于定义更复杂的数据结构。
那么刚才的代码里为什么要这样使用呢?
UnitViewType
使用 enum
是因为它语义上表达了一组固定的离散状态(如蛇头、蛇身等),明确、直观。Pos
使用 struct
是因为坐标是一个简单的数据结构,语义上表示一组绑定的值(x, y),便于封装和操作。
所以简单总结,我们可以得到这样的概括:
enum
的应用场景:用来定义有限的选项集(状态、类型、选项等),语义明确且类型安全。
struct
的应用场景:适合表示简单的数据结构(属性集合),支持值语义且更轻量。
这一期已经开始写代码了,并且讲到了一个重要知识点,下一期我们继续~