美文网首页
swift语法记录-之枚举

swift语法记录-之枚举

作者: LiuffSunny | 来源:发表于2020-04-15 23:19 被阅读0次

    枚举的基本用法

    在C,OC中,枚举就是整形,0,1,2,3...
    在swift中的基本用法


    image.png

    关联值(Associated Value)

    什么时候用枚举,要表达的东西只有几个固定的值

    image.png
    第一个score的例子,是将96这个整型和A这个字符型都存储在枚举的内存中的
    第二个Date的例子中三个整型year month day和string类型的2011-09-10也是存储在枚举的内存中
    关联值的意思是将不同类型的值一起存储到枚举的内存中
    关联值应用举例:
    image.png
    // 原始值(Raw Vlaues)
    enum pukeCard: Character {
        case red = "♥️"
        case black = "♠️"
        case diamond = "♦️"
        case meihua = "♣️"
    }
    // 将pukeCard的第一个成员red赋值给变量suit
    var suit = pukeCard.red
    print(suit)// 打印出来就是成员的名字
    print(suit.rawValue)// 打印出来就是成员的关联值
    print(pukeCard.diamond.rawValue)// 打印出来也是原始值
    // 冒号后面代表原始值是什么类型
    enum Grade: String {
        case perfect = "A"
        case great = "B"
        case good = "C"
        case bad = "D"
    }
    print(Grade.perfect.rawValue)
    print(Grade.great.rawValue)
    print(Grade.good.rawValue)
    print(Grade.bad.rawValue)
    

    隐式原始值

    image.png

    递归枚举(Recursive Enumeration)

    image.png

    关联值的内存布局

    var age = 10 // 此时age是int类型
    // 定义一个枚举有两个成员,其中number有关联值
    // 一般枚举名称首字母大写,遵循驼峰规则,成员一般小写
    enum Password {
        case number(Int,Int,Int,Int)
        case other
    }
    // 在oc中使用sizeof获取内存大小
    MemoryLayout<Int>.size// 8 实际所占的内存空间大小
    MemoryLayout<Int>.stride// 8 分配所占的内存空间大小
    MemoryLayout<Int>.alignment// 8 内存对齐
    
    MemoryLayout<Password>.size// 33 实际所占的内存空间大小(其中关联值占用4*8 = 32 other只需要占用1)
    MemoryLayout<Password>.stride// 40 分配所占的内存空间大小 因为要内存对齐所以只能是8的倍数
    MemoryLayout<Password>.alignment// 8 内存对齐
    
    var pwd = Password.number(5, 6, 7, 8)
    pwd = Password.other// 注意变量一旦分配了内存,是不会随着赋值的改变,内存大小就改变了,一开始分配了多大就是多大
    
    MemoryLayout.size(ofValue: pwd)// 33 实际所占的内存空间大小(其中关联值占用4*8 = 32 other只需要占用1)
    MemoryLayout.stride(ofValue: pwd)// 40 分配所占的内存空间大小 因为要内存对齐所以只能是8的倍数
    MemoryLayout.alignment(ofValue: pwd)// 8 内存对齐
    

    下面看原始值,神奇的事情发生了,竟然只占一个

    enum Season {
        case spring,summer,atumum,winter
    }
    MemoryLayout<Season>.size// 1 
    MemoryLayout<Season>.stride// 1
    MemoryLayout<Season>.alignment// 1
    // 这样写依然是只占一个字节
    enum Season: Int {
        case spring = 1,summer,atumum,winter
    }
    MemoryLayout<Season>.size// 1
    MemoryLayout<Season>.stride// 1
    MemoryLayout<Season>.alignment// 1
    

    重点在于关联值和原始值的区别
    关联值里的成员允许被改变,而原始值里的值是不允许被改变的
    关联值的内存受number()里面关联值类型的影响,并随之改变
    原始值的默认值一成不变没必要为此去浪费内存存储,哪怕Season: String(string占用16个字节),但他依然只占用1个字节.

    enum Season: String {
        case spring = "1",summer = "2",atumum = "3",winter = "4"
    }
    MemoryLayout<Season>.size// 1
    MemoryLayout<Season>.stride// 1
    MemoryLayout<Season>.alignment// 1
    var s = Season.spring
    MemoryLayout.size(ofValue: s)// 1
    MemoryLayout.stride(ofValue: s)// 1
    MemoryLayout.alignment(ofValue: s)// 1
    
    image.png
    在一个枚举后面enum Season: Intenum Season: String这种被称为原始值,而关联值后面则没有明确类型
    如果枚举是关联值,可以传入具体值进行关联的,到时候传入的关联值是直接存储到枚举变量pwd(上述代码中)的内存中的
    如果枚举是关联值,原始值默认是和成员绑定的,到时候是不会占用枚举变量s(上述代码中)的内存的

    相关文章

      网友评论

          本文标题:swift语法记录-之枚举

          本文链接:https://www.haomeiwen.com/subject/crsqvhtx.html