iOS-OC实现字符串类型枚举

西门桃桃 2022-05-07 PM 3281℃ 0条

背景:

服务端返回的是string类型的枚举,我们常用的int类型的枚举,Swift是直接支持string类型的枚举的,但是Objective-Cstring类型的枚举不常用,因此记录一下。

1、基于普通枚举,定义C方法实现

// 先定义一个常见的枚举
typedef NS_ENUM(NSUInteger, FTType) {
    FTTypeRed = 1,
    FTTypeGreen = 2,
    FTTypeOrange = 3,
};
// 定义一个C方法,C方法就是通过枚举值匹配字符串
NSString *FTTypeString(FTType status) {
    switch (status) {
        case FTTypeRed:
            return @"红色";
        case FTTypeGreen:
            return @"绿色";
        case FTTypeOrange:
            return @"橘色";
        default:
            return @"";
    }
}

2、基于普通枚举,定义C数组,设置 枚举值为 index

// 先定义一个常见的枚举
typedef NS_ENUM(NSUInteger, FTType) {
    FTTypeRed = 1,
    FTTypeGreen = 2,
    FTTypeOrange = 3,
};
// 这个是 Map NSString * 类型的数组
NSString *FTTypeStringMap[] = {
    [FTTypeRed] = @"红色",
    [FTTypeGreen] = @"绿色",
    [FTTypeOrange] = @"橘色"
};

// 使用:
FTTypeStringMap[FTTypeRed];// 枚举值

日常做法 宏定义

#define  FTTypeStringRed  @"红色";
#define  FTTypeStringGreen  @"绿色";
#define  FTTypeStringOrange  @"橘色";

上面几种方式都能实现 枚举值 到 字符串的转换,但是有一个缺点: FTTypeStringMapFTTypeString 不能像枚举类型一样直接作为一个类型 限定 传参类型。

定义一种新的数据类型

// 定义一个新的类型 是 NSSting * 类型 类型名字叫 FTTypeStr
typedef NSString *FTTypeStr NS_STRING_ENUM;

static FTTypeStr const FTTypeStringRed = @"红色";
static FTTypeStr const FTTypeStringGreen = @"绿色";
static FTTypeStr const FTTypeStringOrange = @"橘色";

Apple官方的做法

// .h 文件中 -------------
typedef NSString *FTTypeStr NS_STRING_ENUM;

FOUNDATION_EXPORT FTTypeStr const FTTypeStringRed;
FOUNDATION_EXPORT FTTypeStr const FTTypeStringGreen;
FOUNDATION_EXPORT FTTypeStr const FTTypeStringOrange;

// .m 文件中 --------------
NSString * const FTTypeStringRed = @"红色";
NSString * const FTTypeStringGreen = @"绿色";
NSString * const FTTypeStringOrange = @"橘色"; 

比较的时候 StringEnum1 == StringEnum2 直接比较的是内存地址,效率会更高。
相比会产生过多二进制文件的宏定义方式,假如宏定义比较多,建议用FOUNDATION_EXPORT

使用

FTTypeStr aa = @"绿色";//FTTypeStringRed;
if (aa == FTTypeStringGreen) {
    NSLog(@"诶~ 颜色一样哦");
} else {
    NSLog(@"诶~ 颜色不同哦");
}

参考:OC中枚举写法 以及 字符串类型枚举实现探索 - 掘金

标签: 枚举

非特殊说明,本博所有文章均为博主原创。

评论啦~