2010-10-25 49 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

相關問題