2012-08-08 38 views
2

我更像是一名Android开发人员,但我开始在iOS开发的隧道尽头看到了光明。相当于IOS中的静态字段

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

使用静态字段作为标志。

安卓

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上的正确方法?

谢谢。

回答

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; 

这些收藏价值。那么您将获得类型安全和价值检查等好处。

非类型常量:

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++

你可能会赞成引入一个新的范围,这些价值观 - 无论是在一类或名称空间,而不是使用前缀模拟范围。其未在标头前缀使用static

  • 常见错误

    • 为常量使用#define(除非定义是强制性的预处理时)
    • 使用短标识符和标识符
    • 不是使用const时尽可能
    • 声明它们在标题中,当它们可能位于*.m源中时。
  • +0

    感谢贾斯汀。你的答案的第一部分就是我正在寻找的东西。更新完全失去了我。在这种情况下,NSRange的使用确实很少见。 – Yahel 2012-08-08 10:11:04

    +0

    附加问题:你说这是一个常见的错误,不使用const.Can我们可以const枚举? – Yahel 2012-08-08 10:11:53

    +0

    @Yahel'NSRange'示例对于错误代码不会有用。然而,当你想声明一个'struct'(不能用'enum'表示)的常量时,这个例子很有用。 – justin 2012-08-08 10:18:05

    2

    只需添加到贾斯汀的出色答卷 - 为枚举现代的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; 
    
    +0

    +1注意到很好的新语言扩展 – justin 2012-08-08 09:48:58

    +0

    你能告诉我,新类型增加了什么好处?它是某种类型的执行还是允许创建包含NsStrings的枚举? – Yahel 2012-08-08 10:13:32

    +0

    更好的代码完成 - 以及更强大的类型检查。 – Abizern 2012-08-08 10:21:45