持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情
- Swift Optional
- Swift Enum
- iOS开发 做一个三角形
- Swfit 指针类型
- Swift 属性(下)
- Swift 属性
- Swift 小结
- Swift 类与结构体(下)
- Swift 类的生命周期
- Swift 类的初始化器
- Swift 类与结构体
- OpenGL 压缩纹理
- OpenGL 隧道坐标计算
- 0penGL 像素格式及数据类型
- OpenGL 纹理对象
- OpenGL 纹理
- OpenGL 模型变化
- OpenGL 视图
- OpenGL 矩阵
- OpenGL 向量
- OpenGL 颜色混合
- OpenGL 深度测试的潜在风险
- OpenGL 浅析深度测试
- OpenGL 浅析隐藏面消除
- OpenGL 图元连接方式
- 记WKWebView与HTML完成交互两三事
- OpenGL 渲染流程图解析
- OpenGL 控制你的正方形
- OpenGL 专业名词解释
- OpenGL 环境搭建 - MacOS
之前的文章我们探索了指针,今天我们继续来探索一下Swift中的Enum和Optional。
Enum
在Swift语言开发中我们通过 enum 关键字来声明一个枚举
enum Enum {
case test_one
case test_two
case test_three
}
我们都知道在 C 或 OC 中,默认手整数支持,也就是说,下面的例子中 X、Y、Z默认代表 0, 1,2。
typedef NS_ENUM(NSUInteger, Enum) {
X,
Y,
Z,
};
在Swift语言中的枚举则变得更加的灵活,我们并且不需给枚举中的每一个成员都提供值。如果一个值(我们称为“原始”值)要被提供给每一个枚举成员,那么这个值则可以是字符串、字符、任意的整数值,或者是 浮点类型。
enum Color : String {
case red = "Red"
case amber = "Amber"
case green = "Green"
}
enum Enum: Double {
case a = 10.0
case b= 20.0
case c = 30.0
case d = 40.0
}
隐士 RawValue的分配 则是建立在 Swift语言的类型推断机制上的。
enum DayOfWeek: Int {
mon, tue, wed, thu, fri = 10, sat, sun
}
关联值
enum Shape{
case circle(Double)
case rectangle(Int, Int)
}
模式匹配
enum WeakDay: String {
case MONDAYs
case TUEDAYs
case WEDDAYs
case THUDAYs
case FRIDAYs
case SATDAYs
case SUNDAYs
}
let currentWeak: WeakDay
switch currentWeak{
case .MONDAYs: print(WeakDay.MONDAYs.rawValue)
case .TUEDAYs: print(WeakDay.TUEDAYs.rawValue)
case .WEDDAYs: print(WeakDay.WEDDAYs.rawValue)
case .THUDAYs: print(WeakDay.THUDAYs.rawValue)
case .FRIDAYs: print(WeakDay.FRIDAYs.rawValue)
case .SUNDAYs: print(WeakDay.SUNDAYs.rawValue)
case .SATDAYs: print(WeakDay.SUNDAYs.rawValue)
}
如果我们不想匹配所有的 case ,则可以通过使用 defalut 关键字来默认处理
switch currentWeak{
case .SATDAYs, .SUNDAYs: print("Happy Day")
default : print("SAD DAY")
}
枚举的大小
接下来我们一起来讨论一下枚举值所占用的内存大小,在这里我们区分几种不同的情况,第一种就是No-payload enums。
enum WeakDay: String {
case MONDAYs
case TUEDAYs
case WEDDAYs
case THUDAYs
case FRIDAYs
case SATDAYs
case SUNDAYs
}
这种枚举类型和我们在 C 语言中的枚举很类似,当前类型默认是 Int 类型,那么 对于这一类的枚举在内存中是如何布局的?以及在内存中占用的内存大小是多少?这里我们就可以直 接使用 MemoryLayout 来测量一下当前枚举值。
通过结果我们可以看到这里我们测试出来的不管是 size 还是 stride 都是 1 ,这个地方我们也很好理 解,当前的这个 enum 有 8 个case,在 Swift 中进行枚举布局的时候一直是尝试使用最少的空间来存储 enum ,对于当前的 case 数量来说, UInt8 能够表示 256 cases ,也就意味着如果一个默认枚举类型并且在没有关联值的 case 少于 256 的情况下 ,那么,当前枚举类型的大小 都是 1 字节。