Swift的Enum实现简述

78 阅读1分钟

声明

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描述
}

image.png