Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何为一个方法参数接受多个枚举类型_Objective C - Fatal编程技术网

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

Objective c 如何为一个方法参数接受多个枚举类型,objective-c,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; 我希

我看到了几个关于这个问题的问题,但没有关于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:
,如上所述…

从设计的角度来看,这是不好的<代码>内聚性在这里被破坏。然而,编程OOP的概念必须实现,以便重用代码和解耦对象。

从设计的角度来看,这是不好的<代码>内聚性在这里被破坏。编程时,必须实现OOP概念,以便重用代码和解耦对象。

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

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

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

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

您可以尝试这种方法:让第二个枚举从第一个枚举的最后一个索引开始索引,然后在方法中使用single witch。请记住,枚举类型实际上只是一个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;
}

您可以使用int或eColorShape来代替eGraphics。您可以尝试这种方法:让第二个枚举从第一个枚举的最后一个索引开始索引,然后在方法中只使用单个开关。请记住,枚举类型实际上只是一个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;
}

您可以只使用int或eColorShape来代替eGraphics。64位更改的更新:

根据大约64位的变化

枚举也是类型化的:在LLVM编译器中,枚举类型可以 定义枚举的大小。这意味着,一些 类型的大小也可能比您预期的大。这个 和所有其他情况一样,解决方案是不假设 数据类型的大小。而是将任何枚举值赋给变量 使用正确的数据类型

因此,如果您支持64位,则必须使用以下语法创建类型为
的枚举

typedef enum eColor : NSUInteger {
       eColorRed = 1,
       eColorGreen,
       eColorBlue
    } eColor;
然后使用@user2260054的答案,否则,在64位环境中,它将导致以下警告


否则,它将导致警告,因为
隐式转换丢失整数精度:“NSUInteger”(也称为“unsigned long”)到eColor
64位更改的更新: 根据大约64位的变化

枚举也是类型化的:在LLVM编译器中,枚举类型可以 定义枚举的大小。这意味着,一些 类型的大小也可能比您预期的大。这个 和所有其他情况一样,解决方案是不假设 数据类型的大小。而是将任何枚举值赋给变量 使用正确的数据类型

因此,如果您支持64位,则必须使用以下语法创建类型为的枚举

typedef enum eColor : NSUInteger {
       eColorRed = 1,
       eColorGreen,
       eColorBlue
    } eColor;
然后使用@user2260054的答案,否则,在64位环境中,它将导致以下警告


否则,它将导致警告,因为
隐式转换会丢失整数精度:“NSUInteger”(也称为“unsigned long”)到eColor

我使用了这种方法,只是将第二个参数类型替换为。。。一个枚举!谢谢你的帮助。我使用了这种方法,只是将第二个参数类型替换为。。。一个枚举!谢谢你的帮助。谢谢,这是个好主意。但我选择了一个更简单、更容易理解的代码。谢谢,这是个好主意。但我选择了一个更简单、更容易理解的代码。