如何为一个方法参数接受多个枚举类型

时间:2014-04-29 12:49:18

标签: objective-c

我在这个问题上看到了几个问题,但没有关于iOS的问题。

我有两个枚举如下:

// My first enum eColor
typedef enum
{
    eColorRed = 1,
    eColorGreen,
    eColorBlue
} eColor;

// My second enum eShape
typedef enum
{
    eShapeCircle = 1,
    eShapeSquare,
    eRectangle
} eShape;

我想有一个接受这两个枚举的方法:

+ (NSString*) toStr:(bothEnum)e
{
    NSString *result = nil;

    if (bothEnum == eColor)
    {
        switch(e) {
            case eColorRed:
                result = @"red";
                break;
            case eColorGreen:
                result = @"green";
                break;
            case eColorBlue:
                result = @"blue";
                break;
            default:
                result = @"unknown";
        }
    }
    else if (bothEnum == eShape)
    {
        switch (e) {
            case eShapeCircle:
                result = @"circle";
                break;
            case eShapeSquare:
                result = @"square";
                break;
            case eShapeRectangle:
                result = @"rectangle";
                break;
            default:
                result = @"unknown";
        }
    }
    return result;
}

这样的事情可能吗? 我不想使用colorToStr:shapeToStr:等方法。我希望只有一个名为toStr:的方法,如上所述......

4 个答案:

答案 0 :(得分:3)

枚举只是常量,在运行时它们只是数字。所以你的方法不知道什么是eColorRed,它知道它是1,你唯一的选择就是传递额外的参数,告诉你的方法第一个参数传递的是eColorRed或eShapeCircle。它可以只是一个字符串,如:

+ (NSString*) toStr:(NSUInteger)e fromEnumType:(NSString*)type
{
    if([type isEqualToString:@"eColor"])
    {
       switch(e)
       ...
    }
    else if([type isEqualToString:@"eShape"])
    {
       switch(e)
       ...
    }
} 

答案 1 :(得分:2)

你可以尝试这种方法:你让第二个枚举从第一个枚举的最后一个索引开始索引,然后你只需要在你的方法中使用单个巫婆。记住枚举类型确实只是一个int类型。

// My first enum
typedef enum
{
    eColorRed = 1,
    eColorGreen,
    eColorBlue,
    eColorLastIndex
} eColor;

// My second enum
typedef enum
{
    eShapeCircle = eColorLastIndex,
    eShapeSquare,
    eShapeRectangle,
} eShape;

typedef int eTypes;

+(NSString*)toStr:(eTypes)e
{
    NSString *result = nil;

    switch(e) {
        case eColorRed:
            result = @"red";
            break;
        case eColorGreen:
            result = @"green";
            break;
        case eColorBlue:
            result = @"blue";
            break;
        case eShapeCircle:
            result = @"circle";
            break;
        case eShapeSquare:
            result = @"square";
            break;
        case eShapeRectangle:
            result = @"rectangle";
            break;
        default:
            result = @"unknown";
            break;
    }
    return result;
}

相反,eGraphics你可以使用int或eColorShape,无论如何。

答案 2 :(得分:1)

更新64位更改: 根据{{​​3}}大约64位的变化,

  

还输入枚举:在LLVM编译器中,枚举类型可以   定义枚举的大小。这意味着一些枚举   类型的大小也可能比您预期的大。该   与所有其他情况一样,解决方案是不做任何关于a的假设   数据类型的大小。而是将任何枚举值分配给变量   使用适当的数据类型

如果您支持64位,则必须使用类型创建枚举,如下所示。

typedef enum eColor : NSUInteger {
       eColorRed = 1,
       eColorGreen,
       eColorBlue
    } eColor;

然后使用@ user2260054的答案,否则,它将在64位环境中以低于警告的方式发出。

否则,它将导致警告Implicit conversion loses integer precision: 'NSUInteger' (aka 'unsigned long') to eColor

答案 3 :(得分:0)

这对设计观点来说并不好。 Cohesion在这里被打破了。虽然编程OOP概念必须实现,以便重用代码并解耦对象。