如何在Objective-C头文件中初始化常量?

时间:2010-05-31 09:44:38

标签: objective-c header constants

如何初始化头文件中的常量?

例如:

@interface MyClass : NSObject {

  const int foo;

}

@implementation MyClass

-(id)init:{?????;}

3 个答案:

答案 0 :(得分:16)

对于“public”常量,在头文件(.h)中将其声明为extern并在实现文件(.m)中初始化它。

// File.h
extern int const foo;

然后

// File.m
int const foo = 42;

考虑使用enum,如果它不只是一个,而是多个常数属于一起

答案 1 :(得分:12)

Objective C类不支持常量作为成员。你无法按照自己想要的方式创建常量。

声明与类关联的常量的最接近方法是定义一个返回它的类方法。您还可以使用extern直接访问常量。两者都在下面演示:

// header
extern const int MY_CONSTANT;

@interface Foo
{
}

+(int) fooConstant;

@end

// implementation

const int MY_CONSTANT = 23;

static const int FOO_CONST = 34;

@implementation Foo

+(int) fooConstant
{
    return FOO_CONST; // You could also return 34 directly with no static constant
}

@end

类方法版本的一个优点是可以扩展它以非常容易地提供常量对象。您可以使用extern对象,您必须在初始化方法中初始化它们(除非它们是字符串)。所以你经常会看到以下模式:

// header
@interface Foo
{
}

+(Foo*) fooConstant;

@end

// implementation

@implementation Foo

+(Foo*) fooConstant
{
    static Foo* theConstant = nil;
    if (theConstant == nil)
    {
        theConstant = [[Foo alloc] initWithStuff];
    }
    return theConstant;
}

@end

答案 2 :(得分:0)

像整数这样的值类型常量的一种简单方法是使用unbeli提示的enum hack

// File.h
enum {
    SKFoo = 1,
    SKBar = 42,
};

使用extern的一个优点是它在编译时都被解析,所以不需要内存来保存变量。

另一种方法是使用static const来代替C / C ++中的枚举黑客。

// File.h
static const int SKFoo = 1;
static const int SKBar = 42;

通过Apple的标题快速扫描显示,enum hack方法似乎是在Objective-C中执行此操作的首选方法,我实际上发现它更清洁并且自己使用它。

另外,如果要创建选项组,则应考虑使用NS_ENUM创建类型安全常量。

// File.h
typedef NS_ENUM(NSInteger, SKContants) {
    SKFoo = 1,
    SKBar = 42,
};

有关NS_ENUM的更多信息,NSHipster提供了表兄NS_OPTIONS