Objective c 如何为一个方法参数接受多个枚举类型
我看到了几个关于这个问题的问题,但没有关于iOS的问题 我有两个枚举,如下所示: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; 我希
// 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
我使用了这种方法,只是将第二个参数类型替换为。。。一个枚举!谢谢你的帮助。我使用了这种方法,只是将第二个参数类型替换为。。。一个枚举!谢谢你的帮助。谢谢,这是个好主意。但我选择了一个更简单、更容易理解的代码。谢谢,这是个好主意。但我选择了一个更简单、更容易理解的代码。