如何创建一组常量,以提高方法的可用性?

时间:2009-05-15 13:23:55

标签: objective-c cocoa cocoa-touch

我写了一个做一些图形计算的方法。在那里,你可以指定一个起始方向,如“从左边”,“从右边”,“从底部”,“从顶部”。

现在我不希望我的方法的用户传递混乱的值,如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) {...}

5 个答案:

答案 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方法可以正常工作。基本上,枚举只是进行这种常量定义的另一种方式,但它们是由编译套件完成的,而不是让你选择常量来分配给每个名字。枚举中的每个值都保证与其他值不同,而不必经过并确保。如有必要,他们也会进行错误检查。