常見列舉寫法
C語言模式的列舉寫法:enum
typedef enum{
KLTypeRed = 1,
KLTypeGreen = 2,
KLTypeOrange = 3,
} KLType;
複製程式碼
typedef enum{
KLTypeRed = 1,
KLTypeGreen = 2,
KLTypeOrange = 3,
} KLType;
複製程式碼
普通【整型】列舉寫法 :NS_ENUM
typedef NS_ENUM(NSUInteger, KLType) {
KLTypeRed = 1,
KLTypeGreen = 2,
KLTypeOrange = 3,
};
複製程式碼
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,
};
複製程式碼
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 @"";
}
}
複製程式碼
// 先定義一個常見的列舉
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];// 列舉值
複製程式碼
// 先定義一個常見的列舉
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 @"橘色";
複製程式碼
上面幾種方式都能實現 列舉值 到 字串的轉換,但是有一個缺點: KLTypeStringMap
和 KLTypeString
不能像列舉型別一樣直接作為一個型別 限定 傳參型別。
#define KLTypeStringRed @"紅色";
#define KLTypeStringGreen @"綠色";
#define KLTypeStringOrange @"橘色";
複製程式碼
上面幾種方式都能實現 列舉值 到 字串的轉換,但是有一個缺點: KLTypeStringMap
和 KLTypeString
不能像列舉型別一樣直接作為一個型別 限定 傳參型別。
定義一種新的資料型別
// 定義一個新的型別 是 NSSting * 型別 型別名字叫 KLTypeStr
typedef NSString *KLTypeStr NS_STRING_ENUM;
static KLTypeStr const KLTypeStringRed = @"紅色";
static KLTypeStr const KLTypeStringGreen = @"綠色";
static KLTypeStr const KLTypeStringOrange = @"橘色";
複製程式碼
// 定義一個新的型別 是 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。
.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。