我写了一个做一些图形计算的方法。在那里,你可以指定一个起始方向,如“从左边”,“从右边”,“从底部”,“从顶部”。
现在我不希望我的方法的用户传递混乱的值,如1,2,3或4甚至字符串。没有那样的事。相反,我想创建如下的常量:
kFromLeft,kFromRight,kFromTop,kFromBottom
我在Apple头文件中看到过这个:
enum CGImageAlphaInfo {
kCGImageAlphaNone,
kCGImageAlphaPremultipliedLast,
kCGImageAlphaPremultipliedFirst,
kCGImageAlphaLast,
kCGImageAlphaFirst,
kCGImageAlphaNoneSkipLast,
kCGImageAlphaNoneSkipFirst,
kCGImageAlphaOnly
};
typedef enum CGImageAlphaInfo CGImageAlphaInfo;
我不明白的五件事/我不清楚:
1)为什么有一个分号将定义与typedef分开?
2)为什么他们像parot一样重复CGImageAlphaInfo?
3)如果我在我的头文件中放了这样的东西,我会在我的方法中说参数的类型是CGImageAlphaInfo(当然我会有不同的名字),对吗?
4)我通常会以这样的方式指定这些常量的值? (实施例):
#define kCGImageAlphaNone 100
#define kCGImageAlphaPremultipliedLast 300
#define kCGImageAlphaPremultipliedFirst 900
5)我是否需要将这些常量设置为这样的愚蠢值?或者我可以在我的方法中检查传入的常量,例如
if(paramConst == kCGImageAlphaNone) {...}
答案 0 :(得分:6)
1)分号总是终止enum
语句。在这种情况下,有两个单独的语句:一个定义命名枚举,下一个定义一个新类型。
2)enum语句创建一个名为“enum CGImageAlphaInfo
”的新类型。但是到处输入这个很麻烦,所以使用了typedef语句。 typedef语句的工作方式如下:
typedef <sometype> <newname>;
因此enum CGImageAlphaInfo
是旧类型,CGImageAlphaInfo
是新名称。 Apple对两者使用相同的名称,这有点令人困惑,但实际上是最好的方法。
3)对。
4)你可以这样做,但是你必须手动分配常数值;枚举值自动分配。但是,主要的好处是你得到了一些类型检查,因为你可以使用CGImageAlphaInfo
类型而不仅仅是普通的int,这可以更容易地分配无效值。
5)我不确定“愚蠢的价值观”是什么意思。但是,您应该始终按照您描述的方式使用名称进行检查,并且永远不要使用“300”或“1”之类的原始值。
答案 1 :(得分:3)
1)需要使用分号来终止enum
定义。
2)CGImageAlphaInfo
是枚举的名称和定义类型的名称。
3)对。
4)使用#define
作为常量通常被认为是古老的C编程风格。在enum
中声明常量为静态分析器提供了比预处理器宏更多的信息。
5)你应该使用符号,而不是数字文字。
答案 2 :(得分:3)
使用枚举而不是预处理器定义是处理此问题的最佳方法。例如,
typedef enum
{
FromTop = 0,
FromBottom = 1,
FromLeft = 2,
FromRight = 3
} GraphicsLocation;
将它放在Constants.h文件中并在需要时导入它。实际上您不需要包含= 1,= 2 ...,但是如果您需要指定要在其他地方使用的实际数值(例如,如果您在Interface中设置菜单项的tag属性)它很有用生成器)。
我总是声明这样的枚举,而不是你上面发布的Apple示例。也许更熟悉c的人可以留下解释差异的评论。
答案 3 :(得分:1)
枚举代表Enumerated type。
这是一个带有内联定义的普通类型声明,它在结尾处有一个分号,在语法上是正确的。
不知道重复,有人更熟悉Objective-C的这个选择可能会回答这个问题。
类型应该是CGImageAlphaInfo。
嗯,通常是相对的,在这种情况下,使用枚举是非常正常的。
在Java中,您可以通过检查与枚举符号相等的参数来执行此操作。
答案 4 :(得分:1)
你不清楚的事情:
1)因为枚举的声明与类型的声明是分开的。在示例代码中,程序员首先声明枚举,然后声明新类型以使用该枚举。
2)如果用(语法上不正确的)引号来查看它可能会更容易:typedef "enum CGImageAlphaInfo" CGImageAlphaInfo
。您将类型CGImageAlphaInfo
定义为与枚举相同。
3)正确。
4)您的#define
方法可以正常工作。基本上,枚举只是进行这种常量定义的另一种方式,但它们是由编译套件完成的,而不是让你选择常量来分配给每个名字。枚举中的每个值都保证与其他值不同,而不必经过并确保。如有必要,他们也会进行错误检查。