2010-10-25 57 views
1

我可以定义全局的字符串是这样的:如何在objective-C中定义非字符串常量?

// .h 
extern NSString * const myString; 

// .m 
NSString * const myString = @"String"; 

现在我需要同样定义的UIColor,我该怎么办呢?

我想:

// .h 
extern UIColor * const myColor; 

// .m 
UIColor * const myColor = [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:1.0]; 

但它不工作,我越来越error: initializer element is not constant

感谢

+0

类别(来自接受答案中的链接答案)在这里是过度杀伤。请看这个问题:创建一个字典对象:http://stackoverflow.com/questions/3855556/creating-a-constant-dictionary-object/ – 2010-10-25 17:14:54

+0

不知道到底为什么会发生,但[this](http:// stackoverflow.com/questions/2718507/how-do-i-define-constant-values-of-uicolor)问题可能会帮助你解决问题。 – Norling 2010-10-25 15:46:31

回答

5

不能初始化方法调用的全局变量(或任何表达式不是编译时间常量)。它适用于您的@"String"示例,因为这是一个常量表达式。不需要调用代码来评估它。

0

一两件事,工作原理是:

static UIColor *DefaultColor = nil; 

+ (void) initialize { 
    static BOOL initiliazed = NO; 
    if (initialized) 
     return; 
    DefaultColor = [UIColor blackColor]; 
    initialized = YES; 
} 

但是,当然,这是很丑陋的,如果你只是想初始化一个单一的颜色。

+1

你可以摆脱BOOL,并检查DefaultColor是否为零。 – benzado 2010-10-25 15:56:19

+1

或使用'dispatch_once()'并且不打扰检查任何东西:) – 2010-10-25 16:09:19

+0

Ohó,我不知道'dispatch_once',谢谢。 – zoul 2010-10-25 17:54:44

3

不幸的是,字符串是一种特殊情况。对于任何其他类型的对象,您必须将其初始设置为零,然后在启动时提供一个值。做这件事的好地方是在相关类的初始化方法中(不要与实例init方法混淆),在实例化类之前保证至少调用一次。 (注意我说“至少一次”;它可能会被再次调用,这取决于类的层次结构,因此请在为它们分配新值之前检查您的全局变量是否为零)。

+0

具有静态存储时间的变量会自动初始化。 – dreamlax 2010-10-26 01:42:49

+0

@dreamlax是的。 – benzado 2010-10-26 03:07:38

相关问题