Swift Enum

303 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情


  1. Swift Optional
  2. Swift Enum
  3. iOS开发 做一个三角形
  4. Swfit 指针类型
  5. Swift 属性(下)
  6. Swift 属性
  7. Swift 小结
  8. Swift 类与结构体(下)
  9. Swift 类的生命周期
  10. Swift 类的初始化器
  11. Swift 类与结构体
  12. OpenGL 压缩纹理
  13. OpenGL 隧道坐标计算
  14. 0penGL 像素格式及数据类型
  15. OpenGL 纹理对象
  16. OpenGL 纹理
  17. OpenGL 模型变化
  18. OpenGL 视图
  19. OpenGL 矩阵
  20. OpenGL 向量
  21. OpenGL 颜色混合
  22. OpenGL 深度测试的潜在风险
  23. OpenGL 浅析深度测试
  24. OpenGL 浅析隐藏面消除
  25. OpenGL 图元连接方式
  26. 记WKWebView与HTML完成交互两三事
  27. OpenGL 渲染流程图解析
  28. OpenGL 控制你的正方形
  29. OpenGL 专业名词解释
  30. 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 字节。