OC中枚舉寫法 以及 字符串類型枚舉實現探索

常見枚舉寫法

C語言模式的枚舉寫法:enum

typedef enum{
    KLTypeRed = 1,
    KLTypeGreen = 2,
    KLTypeOrange = 3,
} KLType;
複製代碼

普通【整型】枚舉寫法 :NS_ENUM

typedef NS_ENUM(NSUInteger, KLType) {
    KLTypeRed = 1,
    KLTypeGreen = 2,
    KLTypeOrange = 3,
};
複製代碼

位移枚舉 :NS_OPTIONS

typedef NS_OPTIONS(NSUInteger, KLType) {
    KLTypeRed = 1 << 0,
    KLTypeGreen = 1 << 1,
    KLTypeOrange = 1 << 2,
};

複製代碼

字符串類型枚舉實現方式探索

基於普通枚舉,定義C方法實現

// 先定義一個常見的枚舉
typedef NS_ENUM(NSUInteger, KLType) {
    KLTypeRed = 1,
    KLTypeGreen = 2,
    KLTypeOrange = 3,
};
// 定義一個C方法,C方法就是經過枚舉值匹配字符串
NSString *KLTypeString(KLType status) {
    switch (status) {
        case KLTypeRed:
            return @"紅色";
        case KLTypeGreen:
            return @"綠色";
        case KLTypeOrange:
            return @"橘色";
        default:
            return @"";
    }
}
複製代碼

基於普通枚舉,定義C數組,設置 枚舉值爲 index

// 先定義一個常見的枚舉
typedef NS_ENUM(NSUInteger, KLType) {
    KLTypeRed = 1,
    KLTypeGreen = 2,
    KLTypeOrange = 3,
};
// 這個是 Map NSString * 類型的數組
NSString *KLTypeStringMap[] = {
    [KLTypeRed] = @"紅色",
    [KLTypeGreen] = @"綠色",
    [KLTypeOrange] = @"橘色"
};


// 使用:
KLTypeStringMap[KLTypeRed];// 枚舉值
複製代碼

平常作法 宏定義

#define KLTypeStringRed @"紅色";
#define KLTypeStringGreen @"綠色";
#define KLTypeStringOrange @"橘色";
複製代碼

上面幾種方式都能實現 枚舉值 到 字符串的轉換,可是有一個缺點: KLTypeStringMapKLTypeString 不能像枚舉類型同樣直接做爲一個類型 限定 傳參類型。數組

定義一種新的數據類型

// 定義一個新的類型 是 NSSting * 類型 類型名字叫 KLTypeStr
typedef NSString *KLTypeStr NS_STRING_ENUM;

static KLTypeStr const KLTypeStringRed = @"紅色";
static KLTypeStr const KLTypeStringGreen = @"綠色";
static KLTypeStr const KLTypeStringOrange = @"橘色";
複製代碼

Apple官方的作法

.h 文件中 -------------
typedef NSString *KLTypeStr NS_STRING_ENUM;

FOUNDATION_EXPORT KLTypeStr const KLTypeStringRed;
FOUNDATION_EXPORT KLTypeStr const KLTypeStringGreen;
FOUNDATION_EXPORT KLTypeStr const KLTypeStringOrange;

.m 文件中 --------------
NSString * const KLTypeStringRed = @"紅色";
NSString * const KLTypeStringGreen = @"綠色";
NSString * const KLTypeStringOrange = @"橘色"; 

複製代碼

比較的時候 StringEnum1 == StringEnum2 直接比較的是內存地址,效率會更高。
相比會產生過多二進制文件的宏定義方式,假如宏定義比較多,建議用FOUNDATION_EXPORT。bash

相關文章
相關標籤/搜索