Swift——4、枚举
2019-08-04 本文已影响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