关联值
在swift中,枚举的类型可以关联其他类型,而在c或者oc中,枚举的本质是数字。可以说在swift中的枚举更加强大了。
原始值 (Raw Value)
如果枚举成员拥有相同的类型,那么可以给这些成员赋默认值,这些默认值就是原始值,图中可以通过Grade.good.rawValue获取,结果是A,这里要注意的是,必须是相同类型才可以赋值。下面这种就不行。
隐士原始值
关联值内存布局
可以通过MemoryLayout获取当前变量的内存情况,size是获取实际用了的大小,stride是分配占用的大小。number占用32个字节,other占用1字节,为了保持8字节对齐,所以分配了40字节。
原始值内存布局
原始值的内存大小在枚举定义以后就固定了,他不像关联值,因为关联了外部的类型,所以是可变的,因此他的内容是存储在枚举变量里的,但是原始值没有这个必要每次都存,在定义以后,可以看成是0,1,2,3之类,如果要取值,可以直接通过rawvalue去取,为了节省内存,所以此时打印的是1. s的类型不是int类型,是枚举类型。
关联值和原始值的内存分析
关联值的内部的内存分配其实是由一个字节的存储成员值,N个字节存储关联值,如图,有一个字节存储test1或者test2...,其他内存存储关联值,比如说第一个枚举成员的三个int类型的参数,那么这个枚举类型关联值的内存是前24个字节,一个int占8字节,第25个字节存储成员值内容,从test1开始对应0,test2对应1,以此类推。而原始值是不存储内容的,只存储成员值,也就是0、1、2、3...,你可以根据索引去查找rawValue。
配合switch实现原理
我们知道,每个枚举值都存在一个成员值,并且成员值底层是0,1,2,3...的"编号",那么在switch判断的时候,其实就是根据这个成员值去找到对应的"编号",然后把值赋值给case里面对应的成员变量,而不是调方法去判断。