原视频:www.bilibili.com/video/BV1uZ…
Swift入门-简洁版(3 / 3)
二十三、枚举
- 枚举的基本用法
-
关联值(Associated Values)
-
有时会将枚举的成员值跟其他类型的关联存储在一起,会非常有用
enum Score { case points(Int) case grade(Character) }var score = Score.points(96) score = .grade("A")switch score { case let .points(i): print(i, "points") case let .grade(i): print("grade", i) } // grade Aenum Date { case digit(year: Int, month: Int, day: Int) case string(String) } var date = Date.digit(year: 2011, month: 9, day: 10) date = .string("2011-09-10") switch date { case .digit(let year, let month, let day): print(year, month, day) case let .string(value): print(value) }必要时
let也可以改为var -
关联值举例:
enum Password { case number(Int, Int, Int, Int) case gesture(String) }var pwd = Password.number(3,5,7,8) pwd = .gesture("12369")switch pwd { case let .number(n1, n2 ,n3 ,n4): print("number is ",n1 ,n2 ,n3 ,n4) case let .gesture(str): print("gesture is", str) }
-
-
原始值(Raw Values)
枚举成员可以使用相同类型的默认值预先关联,这个默认值叫做:原始值
enum PokerSuit : Character { case spade = "♠" case heart = "❤" case diamond = "♦" case club = "♣" }var suit = PokerSuit.spade print(suit) // spade print(suit.rawValue) // ♠ print(PokerSuit.club.rawValue) // ♣ -
隐式原始值(Implicitly Assigned Raw Values)
如果枚举的原始值类型是
Int、StringSwift会自动分配原始值 -
递归枚举(Recursive Enumeration)
-
MemoryLayout
可以使用
MemoryLayout获取数据类型占用的内存大小MemoryLayout<Int>.size // 8 实际用到的空间大小 MemoryLayout<Int>.stride // 8 分配占用的空间大小 MemoryLayout<Int>.aligment // 内存对齐 8 var age = 10 MemoryLayout.size(ofValue: age) // 8 MemoryLayout.stride(ofValue: age) // 8 MemoryLayout.aligment(ofValue: age) // 内存对齐 8 -
关联值和原始值在内存分配上是有区别的
- 原始值是固定死的
- 关联值需看具体类型
二十四、内存分析
思考下面枚举变量的内存布局