04-枚舉

枚舉的基本用法

關聯(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

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容