首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NSString的枚举值(iOS)

NSString的枚举值(iOS)
EN

Stack Overflow用户
提问于 2011-06-13 22:27:19
回答 15查看 111.7K关注 0票数 66

我有一个包含多个值的枚举:

枚举{value1,value2,value3} myValue;

在我的应用程序中的某个点上,我希望检查枚举的哪个值现在是活动的。我正在使用NSLog,但是我不清楚如何显示枚举的当前值(value1/value2/value3/etc...)作为NSLog的NSString。

有没有人?

EN

回答 15

Stack Overflow用户

回答已采纳

发布于 2011-07-13 02:08:29

答案在这里:a few suggestions on implementation

归根结底,Objective-C使用的是一个常规的、旧的C enum,它只是一组美化的整数。

给定一个如下所示的enum

代码语言:javascript
运行
复制
typedef enum { a, b, c } FirstThreeAlpha;

您的方法将如下所示:

代码语言:javascript
运行
复制
- (NSString*) convertToString:(FirstThreeAlpha) whichAlpha {
    NSString *result = nil;

    switch(whichAlpha) {
        case a:
            result = @"a";
            break;
        case b:
            result = @"b";
            break;
        case c:
            result = @"c";
            break;

        default:
            result = @"unknown";
    }

    return result;
}
票数 58
EN

Stack Overflow用户

发布于 2013-07-11 23:27:33

我不喜欢将枚举放在堆上,而不提供堆函数进行转换。这是我想出来的:

代码语言:javascript
运行
复制
typedef enum {value1, value2, value3} myValue;
#define myValueString(enum) [@[@"value1",@"value2",@"value3"] objectAtIndex:enum]

这使得枚举和字符串声明紧密结合在一起,以便在需要时轻松更新。

现在,在代码中的任何地方,您都可以像这样使用枚举/宏:

代码语言:javascript
运行
复制
myValue aVal = value2;
NSLog(@"The enum value is '%@'.", myValueString(aVal));

outputs: The enum value is 'value2'.

为了保证元素索引,您总是可以显式地声明start(或all)枚举值。

代码语言:javascript
运行
复制
enum {value1=0, value2=1, value3=2};
票数 88
EN

Stack Overflow用户

发布于 2014-02-21 23:08:39

这将由编译器进行验证,因此您不会意外地混淆索引。

代码语言:javascript
运行
复制
NSDictionary *stateStrings =
 @{
   @(MCSessionStateNotConnected) : @"MCSessionStateNotConnected",
   @(MCSessionStateConnecting) : @"MCSessionStateConnecting",
   @(MCSessionStateConnected) : @"MCSessionStateConnected",
  };
NSString *stateString = [stateStrings objectForKey:@(state)];

代码语言:javascript
运行
复制
var stateStrings: [MCSessionState: String] = [
    .notConnected : "MCSessionState.notConnected",
    .connecting : "MCSessionState.connecting",
    .connected : "MCSessionState.connected"
]
var stateString = stateStrings[MCSessionState.Connected]

更新:一种更快速的方式是扩展符合CustomStringConvertible的枚举。此外,通过这种方式,编译器将确保实现底层枚举中的每个新添加(而使用数组则不会),因为switch语句必须是详尽的。

代码语言:javascript
运行
复制
extension MCSessionState: CustomStringConvertible {
    
    public var description: String {
        switch self {
        case .notConnected:
            return "MCSessionState.notConnected"
        case .connecting:
            return "MCSessionState.connecting"
        case .connected:
            return "MCSessionState.connected"
        @unknown default:
            return "Unknown"
        }
    }
}

代码语言:javascript
运行
复制
// You can use it like this.
var stateString = MCSessionState.connected.description

// Or this.
var stateString = "\(MCSessionState.connected)"
票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6331762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档