如何在Objective-C中通过名称获取枚举值?
Objective-C中实现类似Java枚举
valueOf的功能? 首先是定义的枚举类型:
typedef NS_ENUM(NSInteger, CameraMode) { DEFAULT, SMART, LIVENESS, DOCUMENT };
我想要实现类似如下的功能:
NSInteger mode = CameraMode.getValue("DEFAULT");
请问这在Objective-C中是否可行?我曾在Java中通过如下方式实现类似功能:
CameraMode.valueOf("DEFAULT");
Objective-C的NS_ENUM本质是基于NSInteger的底层枚举类型,并没有像Java枚举那样内置字符串转枚举的valueOf方法,需要手动实现对应的转换逻辑。
你可以通过以下几种方式实现类似需求:
方式一:工具函数实现
CameraMode CameraModeFromString(NSString *modeString) { if ([modeString isEqualToString:@"DEFAULT"]) { return DEFAULT; } else if ([modeString isEqualToString:@"SMART"]) { return SMART; } else if ([modeString isEqualToString:@"LIVENESS"]) { return LIVENESS; } else if ([modeString isEqualToString:@"DOCUMENT"]) { return DOCUMENT; } // 非法输入时返回默认值,也可根据需求抛出异常 return DEFAULT; }
调用示例:
CameraMode mode = CameraModeFromString(@"DEFAULT");
方式二:封装类方法实现
如果想让调用语法更贴近你期望的形式,可以封装成类方法:
@interface CameraModeHelper : NSObject + (CameraMode)cameraModeFromString:(NSString *)string; @end @implementation CameraModeHelper + (CameraMode)cameraModeFromString:(NSString *)string { static NSDictionary *modeMap; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ modeMap = @{ @"DEFAULT": @(DEFAULT), @"SMART": @(SMART), @"LIVENESS": @(LIVENESS), @"DOCUMENT": @(DOCUMENT) }; }); NSNumber *modeNum = modeMap[string]; return modeNum ? modeNum.integerValue : DEFAULT; } @end
调用示例:
CameraMode mode = [CameraModeHelper cameraModeFromString:@"DEFAULT"];
另外需要注意:你示例中的NSInt *mode是错误写法,正确类型应为CameraMode或NSInteger——因为Objective-C枚举本质是基础整数类型,并非对象指针。
内容的提问来源于stack exchange,提问作者Giulia Lage
相关产品推荐
相关产品推荐

