枚舉的基本用法

關聯(lián)值(Associated Values)

關聯(lián)值舉例

原始值(Raw Values)

注:原始值不占用枚舉變量的內(nèi)存
隱式原始值(Implicitly Assigned Raw Values)

遞歸枚舉(Recursive Enumeration)

MemoryLayout
MemoryLayout<Int>.size // 實際用到的空間大小
MemoryLayout<Int>.stride // 分配占用的空間大小
MemoryLayout<Int>.alignment // 對齊參數(shù)
MemoryLayout.size(ofValue: age)
MemoryLayout.stride(ofValue: age)
MemoryLayout.alignment(ofValue: age)

enum Password {
case number(Int, Int, Int, Int) // 32個字節(jié)
case other // 1個字節(jié)->其實不是other占1個字節(jié) 是枚舉類型變量占1個字節(jié)
}
var pwd = Password.number(1, 5, 4, 4) // 33個字節(jié)
// 枚舉類型變量會占用1個字節(jié) 不論枚舉變量類型是Int還是String 都不會根據(jù)定義類型來計算字節(jié)大小
enum Season {
case spring, summer, autumn, winter // 1個字節(jié)
}
// other的1不是說other占一個字節(jié) 這一個1節(jié)其實用來區(qū)分number還是other
/// 關聯(lián)值跟原始值的區(qū)別
/// 1、關聯(lián)類型的枚舉,其實是會存儲對應的關聯(lián)類型的值的,關聯(lián)類型占用多少個字節(jié)就影響枚舉的內(nèi)存
/// 關聯(lián)值會占用枚舉變量的內(nèi)存,會根據(jù)外界傳值類型計算大小
/// 2、原始值不允許你自定義,也不會根據(jù)枚舉類型計算內(nèi)存大小
/// 原始值不會占用枚舉變量的內(nèi)存,只會占用1個字節(jié),用來標記枚舉類型
思考下面枚舉變量的內(nèi)存布局

func testEnum() {
enum TestEnum {
case test1(Int, Int, Int)
case test2(Int, Int)
case test3(Int)
case test4(Bool)
case test5
}
// 小端:高高低低
// 01 00 00 00 00 00 00 00
// 02 00 00 00 00 00 00 00
// 03 00 00 00 00 00 00 00
// 00
// 00 00 00 00 00 00 00
var e = TestEnum.test1(1, 2, 3)
print(Mems.ptr(ofVal: &e))
// 04 00 00 00 00 00 00 00
// 05 00 00 00 00 00 00 00
// 00 00 00 00 00 00 00 00
// 01
// 00 00 00 00 00 00 00
e = .test2(4, 5)
print(Mems.memStr(ofVal: &e))
// 06 00 00 00 00 00 00 00
// 00 00 00 00 00 00 00 00
// 00 00 00 00 00 00 00 00
// 02
// 00 00 00 00 00 00 00
e = .test3(6)
// 01 00 00 00 00 00 00 00
// 00 00 00 00 00 00 00 00
// 00 00 00 00 00 00 00 00
// 03
// 00 00 00 00 00 00 00
e = .test4(true)
// 00 00 00 00 00 00 00 00
// 00 00 00 00 00 00 00 00
// 00 00 00 00 00 00 00 00
// 04
// 00 00 00 00 00 00 00
e = .test5
}
枚舉 - 關聯(lián)值
1個字節(jié)存儲成員值
N個字節(jié)存儲關聯(lián)值(N取占用內(nèi)存最大的關聯(lián)值),任何一個case的關聯(lián)值都共用這N個字節(jié)
共用體枚舉 - 原始值
原始值不占用枚舉內(nèi)存
如果只有一個case的話 不會占用內(nèi)存
如果超過1個case 會有1個字節(jié)去存儲區(qū)分具體是哪個case
窺探內(nèi)存


窺探內(nèi)存細節(jié)的小工具: https://github.com/CoderMJLee/Mems