声明
Swift的Enum的声明成两种模式纯原始值和相关值。
纯原始值
- 支持自定义case值类型
enum CompassPoint: String {
case north, south, east, west
}
PS: 自定义原始值的case类型,原理是通过实现RawRepresentable协议,将具体值存在rawValue的getter方法里
相关值
- 可以混合原始值的声明,但不能自定义case值具体类型
enum Barcode {
case emptyCode
case unknownCode
case upc(Int, Int, Int, Int)
case qrCode(String)
}
Enum变量的内存布局
纯原始值
struct EnumValue {
int payload_index; // case的下标
}
相关值
struct EnumValue {
union {
int empty_case_index; // 原始值case的具体下标
// payload data // 相关值存储的变量
}
// 相关值case的下标,其中有一个值对应原始值case(如果有)
// 如emptyCode和unknownCode在此处对应同个下标
int payload_index;
}
PS: 下标的int类型的具体位数取决于对应的case总数
Enum类型的结构
struct EnumDescriptor {
uint32 flags;
uint32 parent;
uint32_t name; // enum的名字
uint32_t accessFunction;
uint32_t fieldDescriptor; // case的描述(FieldDescriptor)
uint32_t numPayloadCasesAndPayloadSizeOffset; // 相关值类型的case个数
uint32_t numEmptyCases; // 原始值的case个数
}
struct FieldRecord {
uint32 flags;
uint32 mangledTypeName;
uint32 fieldName; // case的名字
}
struct FieldDescriptor {
uint32 mangledTypeName;
uint32 superclass;
uint32 fieldDescriptorKind;
uint16 fieldRecordSize;
uint32 numFields; // case个数
FieldRecord record[]; // case描述
}