相当于IOS中的静态字段

时间:2012-08-08 09:12:13

标签: ios static-members

我更像是一名Android开发人员,但我开始在iOS开发中看到隧道尽头的亮点。

然而,有一种编码模式我似乎无法找到等效的。

使用静态字段作为标志。

Android:

public final static int ERROR_EMPTY = 1;
public final static int ERROR_NO_CONNECTION = 2;
public final static int ERROR_WRONG_USER = 4;

...

if (error == MyClass.ERROR_EMPTY) {//do things}

在iOS上实现这一目标的正确方法是什么?

感谢。

2 个答案:

答案 0 :(得分:4)

使用Objective-C和C

我经常使用前缀:

typedef enum MyClass_Error {
  // never use MyClass_Error_Undefined
  // or you may favor MyClass_Error_None for a valid error code
  MyClass_Error_Undefined = 0,
  MyClass_Error_Empty = 1,
  MyClass_Error_NoConnection = 2,
  MyClass_Error_WrongUser = 4
  // ...
} MyClass_Error;

这些价​​值集合。然后你会获得诸如类型安全和switch价值检查等好处。

表示非类型常量:

enum { MyClass_ConstantName = 4 };

并随时隐藏这些内容*.m

另请注意,C enum可能在其定义的值中存在间隙(与Java不同)。

更新:有更好的方式来声明枚举,如Abizern的回答所示 - 如果你坚持使用最新的工具链。使用此扩展的主要原因是二进制兼容性和编码(尽管我赞成固定宽度类型用于这些目的)。


对于您想要使用现有类型的情况,还有一些其他变体:

私人常量

MyClass.m

static const NSRange MyClass_InputRange = {1,1};

公共常量

MyClass.h

extern const NSRange MyClass_InputRange;

MyClass.m

const NSRange MyClass_InputRange = {1,1};

使用C ++

您可能倾向于在类或命名空间中引入这些值的新范围,而不是使用前缀来模拟范围。

常见错误

  • #define用于常量(除非在预处理时必须定义)
  • 使用短标识符和未加前缀的标识符
  • 在标题中使用static
  • 尽可能使用const
  • 当它们位于*.m来源时,在标题中声明它们。

答案 1 :(得分:2)

只是为了增加Justin的优秀答案 - 枚举的现代Objective-C定义将是:

typedef enum MyClass_Error : NSUInteger {
  // never use MyClass_Error_Undefined
  // or you may favor MyClass_Error_None for a valid error code
  MyClass_Error_Undefined = 0,
  MyClass_Error_Empty = 1,
  MyClass_Error_NoConnection = 2
  // ...
} MyClass_Error;