- RawValue
enum Week: String {
case MON, TUE, WED, THU, FRI, SAT, SUN
}
swiftc -emit-sil main.swift
sil源码:
enum Week : String {
case MON, TUE, WED, THU, FRI, SAT, SUN
init?(rawValue: String)
typealias RawValue = String
var rawValue: String { get }
}
实现:
print(Week(rawValue: "SUN"))
print(Week.init(rawValue: "SAT"))
print(Week(rawValue: "Hello"))
输出:
Optional(swift_Enum.Week.SUN)
Optional(swift_Enum.Week.SAT)
nil
why?
源码展示
调用_findStringSwitchCase.png
实现_findStringSwitchCase.png
内存分布.png
bb28、bb29.png
- 关联值
enum Shape {
case circle(radious: Double)
case rectangle(width:Int, height:Int)
}
sil 源码
enum Shape {
case circle(radious: Double)
case rectangle(width: Int, height: Int)
}
只有case和关联值,没有typealias取别名,没有init方法,没有rawValue计算属性
var circle = Shape.circle(radious: 20.0)
var rec = Shape.rectangle(width: 10, height: 20)
内存分布
枚举.png
内存大小.png
关联枚举.png
内存分布.png
内存分配.png
内存对齐&字节对齐
- 内存对齐: ios 采用 8 字节,只会在对象的初始化分配内存是出现,malloc、alloc
- 字节对齐:第一个数据成员放在 0 位置,以后每个成员存储的其实位置要从该成员大小或改成员的子成员大小(只要该成员有子成员,例如数组、结构体等)的整数倍开始。比如 Int 位 8 字节,则要从 8 的整数倍开始存储。
网友评论