【问题标题】:Can I retrieve the list of all items in an enumeration/type?我可以检索枚举/类型中所有项目的列表吗?
【发布时间】:2013-11-26 12:13:28
【问题描述】:

我想知道,是否可以检索枚举中所有项目的列表?

例如我定义的:

typedef enum YouJustUnlocked {
    Unlocked_A,
    Unlocked_B,
    //etc... many more
    Unlocked_Nothing,
}YouJustUnlocked;

有没有办法在新定义的枚举类型 YouJustUnlocked 中检索所有“项目”(不准确的词)的列表?

Objective-C 支持吗?

我想要类似的东西:

NSArray * array = [YouJustUnlocked returnAllItemsInWrapperObjectForm];
YouJustUnlocked item = (YouJustUnlocked) [array objectAtIndex:0];
//Assuming that array will contain some sort of wrapper object (like NSInteger)

【问题讨论】:

  • NSInteger 不是对象,不能直接放入数组中。
  • 我知道,但这就是为什么我要问 Objective C 语义中是否有一个特性,它返回一个通用包装器(例如 NSInteger),它包装了我定义的枚举。鉴于枚举是由 int 定义的,它是有意义的。此外,Objective-C 和 iOS 使用编码器功能,在那里,对枚举进行编码,是使用 encodeAsInt 功能的常见做法。所以我想知道是否有类似的东西。
  • 我不同意最后的投票。如果您阅读它,这个问题就很清楚了。

标签: objective-c arrays types enums wrapper


【解决方案1】:

不,如果不使用等效的描述列表,这是不可能的:

YourClass.h:

typedef enum YouJustUnlocked {
    Unlocked_A,
    Unlocked_B,
    //etc... many more
    Unlocked_Nothing,
    // Add this:
    Num_Unlocked
}YouJustUnlocked;

YourClass.m:

static NSString *_youJustUnlockedDesc[Num_Unlocked] = {
    @"Unlocked_A",
    @"Unlocked_B",
    //etc... many more
    @"Unlocked_Nothing",
}

@implementation YourClass

+ (NSString *)youHaveUnlockedDesc:(YouJustUnlocked)yju {
    NSAssert(yju < Num_Unlocked, @"Out-of-range");
    return _youJustUnlockedDesc[yju];
}

...

@end

注意事项:

  • typedef 将在头文件中,而描述数组将在实现文件中。
  • Unlocked_Nothing 通常应该是enum 的第一个元素。

【讨论】:

  • +1 鬼鬼祟祟 - 虽然不完全是 OP 要求的,但它确实有效!虽然听起来 OP 正在尝试做一些可能更优雅的事情,如果我们知道的话。
  • @Abizern 是的,我可能错过了什么:)
【解决方案2】:

如果你的枚举值是连续的,你也许可以这样做:

typedef enum {
        eUnlockedNothing = 0,
        eUnlockedA, /* inferred that this is 1 */
        eUnlockedB,
        eUnlockedMax
    } YouJustUnlocked;

NSMutableArray *array = [NSMutableArray array];
for (int i = eUnlockedNothing + 1; i < eUnlockedMax; i++)
{
    [array addObject:@(eUnlockedNothing + i)];
}

YouJustUnlocked item = (YouJustUnlocked) [[array objectAtIndex:0] intValue]; //enums are default ints.

结果是您有一个可以通过索引访问的枚举值数组。此数组不包含 eUnlockedNothingeUnlockedMax 值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-08
    • 2011-01-07
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多