我在这个问题上看到了几个问题,但没有关于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:
的方法,如上所述......
答案 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概念必须实现,以便重用代码并解耦对象。