美文网首页Swift
Swift——4、枚举

Swift——4、枚举

作者: 天空像天空一样蓝 | 来源:发表于2019-08-04 15:43 被阅读0次

    枚举

    枚举

    关联值

    • 有时将枚举的成员值跟其他类型的关联值存储在一起,会非常有用
    关联值

    caset let .points(i) let也可以定义为var
    caset let .points(i) let 定义在 前面,表示 i 的类型为let
    case .digit(let year, let month, let day) let 定义在里面,分别表示不同的类型,定义在外面的话,里面只能是一种类型

    关联值举例

    • 直接将值传入到


      举例

    原始值

    • 枚举成员可以使用相同类型的默认值预先对应,这个默认值叫做原始值
    • 原始值不占用枚举变量的内存
    原始值
    隐式原始值
    • 如果枚举的原始值类型是Int,String,Swift会自动分配原始值
    • string的话,名字是啥,值就是啥
    • Int的话,会自动从0开始累加(如指定,则从指定的值开始累加)
    隐式原始值

    递归枚举

    • 里面的内容使用了自己,如果是递归枚举必须使用indirect修饰
    • indirect 可以放在枚举的前面,也可以分别放
    递归枚举

    MemoryLayout

    • 可以使用MemoryLayout获取数据类型占用内存的大小
    • stride 分配的内存大小 size实际占用的大小 alignment内存对齐
    enum Password {
        case number(Int, Int, Int, Int) // 32
        case other // 1
    }
    
    
    print("stride == \(MemoryLayout<Password>.stride)") // stride == 40
    print("size == \(MemoryLayout<Password>.size)") // size == 33
    print("alignment == \(MemoryLayout<Password>.alignment)") // alignment == 8
    
    
    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
    /// 03 00 00 00 00 00 00 00
    /// 04 00 00 00 00 00 00 00
    /// 00 00 00 00 00 00 00 00
    var e = TestEnum.test1(1, 3, 4)
    print(Mems.ptr(ofVal: &e))
    /// 05 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(5)
    /// 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)
    
    

    观察上面代码,可以得出:

    • 1个字节存储成员变量 (0, 1, 2,3,4)存放的就是成员变量
    • N个字节存储关联值(N取占用内存最大的关联值),任何一个case的关联值都公用这N个字节
    • 只有一个case时,不会需要一个字节去存储成员变量
    enum Password {
        case other(Int)
    }
    stride == 8
    size == 8
    alignment == 8
    

    注意点:观察下面代码

    • 因为只有一个值,不会先去占用内存。
    enum Password {
        case other
    }
    
    print("stride == \(MemoryLayout<Password>.stride)") // stride == 1
    print("size == \(MemoryLayout<Password>.size)") // size == 0
    print("alignment == \(MemoryLayout<Password>.alignment)") // alignment == 1
    
    

    相关文章

      网友评论

        本文标题:Swift——4、枚举

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