从零开始的SWIFT开发之枚举

138 阅读2分钟

关联值

截屏2022-05-20 14.27.39.png

在swift中,枚举的类型可以关联其他类型,而在c或者oc中,枚举的本质是数字。可以说在swift中的枚举更加强大了。

原始值 (Raw Value)

截屏2022-05-20 14.39.43.png

如果枚举成员拥有相同的类型,那么可以给这些成员赋默认值,这些默认值就是原始值,图中可以通过Grade.good.rawValue获取,结果是A,这里要注意的是,必须是相同类型才可以赋值。下面这种就不行。

截屏2022-05-20 14.39.29.png

隐士原始值

截屏2022-05-20 14.44.28.png

关联值内存布局

可以通过MemoryLayout获取当前变量的内存情况,size是获取实际用了的大小,stride是分配占用的大小。number占用32个字节,other占用1字节,为了保持8字节对齐,所以分配了40字节。

截屏2022-05-20 15.19.54.png

原始值内存布局

原始值的内存大小在枚举定义以后就固定了,他不像关联值,因为关联了外部的类型,所以是可变的,因此他的内容是存储在枚举变量里的,但是原始值没有这个必要每次都存,在定义以后,可以看成是0,1,2,3之类,如果要取值,可以直接通过rawvalue去取,为了节省内存,所以此时打印的是1. s的类型不是int类型,是枚举类型。 截屏2022-05-20 15.31.30.png

关联值和原始值的内存分析

截屏2022-05-20 17.54.15.png

关联值的内部的内存分配其实是由一个字节的存储成员值,N个字节存储关联值,如图,有一个字节存储test1或者test2...,其他内存存储关联值,比如说第一个枚举成员的三个int类型的参数,那么这个枚举类型关联值的内存是前24个字节,一个int占8字节,第25个字节存储成员值内容,从test1开始对应0,test2对应1,以此类推。而原始值是不存储内容的,只存储成员值,也就是0、1、2、3...,你可以根据索引去查找rawValue。

配合switch实现原理

截屏2022-05-23 16.22.18.png

我们知道,每个枚举值都存在一个成员值,并且成员值底层是0,1,2,3...的"编号",那么在switch判断的时候,其实就是根据这个成员值去找到对应的"编号",然后把值赋值给case里面对应的成员变量,而不是调方法去判断。