我更像是一名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上实现这一目标的正确方法是什么?
感谢。
答案 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;