如何在Objective-C中迭代throw typedef枚举?

Van*_*nel 3 enums objective-c ios

我正在开发一个带有最新SDK的iOS应用程序.

我有这个枚举:

typedef enum BoxTypeValues {
    Speed,
    FPS,
    Altitude,
    Location,
    Accuracy
} BoxType;
Run Code Online (Sandbox Code Playgroud)

我想迭代抛出它的所有值并将它们转换为NSString.

我这样做,但它很难编码:

+ (NSArray*)BoxTypeValues
{
    return [NSArray arrayWithObjects:@"Speed", @"FPS", @"Altitude", @"Location",
            @"Accuracy", nil];
}

+ (NSString*)BoxTypeToString:(BoxType)aType
{
    NSString* result = nil;

    switch (aType)
    {
        case Speed:
            result = @"Speed";
            break;
        case FPS:
            result = @"FPS";
            break;
        case Altitude:
            result = @"Altitude";
            break;
        case Location:
            result = @"Location";
            break;
        case Accuracy:
            result = @"Accuracy";
            break;

        default:
            break;
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

有什么建议?

Mik*_*ler 6

将枚举值转换为字符串是宏可以帮助很多的极少数情况之一.例如:

- (NSString*)BoxTypeToString:(BoxType)aType
{
#define CASE(VALUE) case (VALUE): return @( #VALUE )
    switch (aType) {
            CASE(Speed);
            CASE(FPS);
            CASE(Altitude);
            CASE(Location);
            CASE(Accuracy);

        default:
            // should not get here
            assert(0);
            break;
    }
#undef CASE
    return nil;
}
Run Code Online (Sandbox Code Playgroud)

您的BoxTypeValues方法将如下所示:

- (NSArray*)BoxTypeStringValues
{
    return @[
        [self BoxTypeToString:Speed],
        [self BoxTypeToString:FPS],
        [self BoxTypeToString:Altitude],
        [self BoxTypeToString:Location],
        [self BoxTypeToString:Accuracy]
      ];
}
Run Code Online (Sandbox Code Playgroud)

即使在重构操作重命名枚举值之后,这仍然可以很好地工作.您可能希望为CASE宏提供某种唯一的前缀,以避免与其他代码冲突.

至于枚举枚举值,除非你可以依赖于顺序值并使用标准for循环(正如其他人所建议的那样),否则你运气不好.