2014-01-06 27 views
0

我開始鑽研iOS開發,並且正在學習Objective C。我的背景是Java。
我試圖創建一個簡單的單機遊戲,並創建了以下常量:從另一個常量不能正常工作

#import <Foundation/Foundation.h> 

static const NSString *ROCK = @"Rock"; 
static const NSString *PAPER = @"Paper"; 
static const NSString *SCISSORS = @"Scissors"; 
static const NSString *LIZZARD = @"Lizzard"; 
static const NSString *SPOCK = @"Spock"; 
static const NSArray *WEAPONS = @[SPOCK, ROCK, SCISSORS, LIZZARD, PAPER]; 

麻煩的是,我得到的最後一行的錯誤:Initializer element is not a compile-time constant

我試圖找出這意味着什麼 - 「這是因爲對象的作品[原文]在運行時」我能找到的最接近的事情是this question由弗雷德·柯林斯,他指出,我仍然不完全確定這是什麼意思 - 這與Java有何不同? (我絕對可以在Java中做到這一點!)

無論如何,我需要一些初始化NSArray *WEAPONS的方法,並且我無法在不添加其他文件的情況下爲Fred Collin的問題找到答案。 (他正在使用他的常量類,因爲我的程序很容易包含在與主要方法相同的文件中。)

+0

查看http://stackoverflow.com/questions/12304740/initializer-element-is-not-a-compile-time-constant-why – jarmod

+0

你真的用Java標記過嗎? ':/' – ADTC

回答

-1

正確的方法是在對象的init方法中執行此操作,或者

static const NSArray *WEAPONS = @[@"SPOCK", @"ROCK", @"SCISSORS", @"LIZZARD", @"PAPER"]; 

但我不會推薦這一個。

+0

你可以在你的答案中添加一個示例init方法嗎? –

+0

我剛剛嘗試了您的「不推薦」建議,即使它不是從其他常量構建的,它也會失敗並顯示相同的錯誤。現在我很困惑。 –

+0

無論它在哪裏,你都不能擁有這樣的代碼。 – rmaddy

0

NSArrays不允許像那樣使用,必須在方法內完成。除了NSString以外,大多數情況都是不允許的。

嘗試像

static const NSString *ROCK = @"Rock"; 
static const NSString *PAPER = @"Paper"; 
static const NSString *SCISSORS = @"Scissors"; 
static const NSString *LIZZARD = @"Lizzard"; 
static const NSString *SPOCK = @"Spock"; 
static const NSArray *WEAPONS = nil; 
- (void)init 
{ 
    WEAPONS = @[SPOCK, ROCK, SCISSORS, LIZZARD, PAPER]; 
} 
+0

不要初始化實例方法中的靜態值,除非您至少驗證它尚未初始化。更好的方法是在'initialize'類方法中初始化靜態變量。 – rmaddy

1

一個初始化數組正確的方法是做到這一點:

static const NSString *ROCK = @"Rock"; 
static const NSString *PAPER = @"Paper"; 
static const NSString *SCISSORS = @"Scissors"; 
static const NSString *LIZZARD = @"Lizzard"; 
static const NSString *SPOCK = @"Spock"; 
static const NSArray *WEAPONS = nil; 

+ (void)initialize { 
    WEAPONS = @[SPOCK, ROCK, SCISSORS, LIZZARD, PAPER]; 
} 

initialize類方法是一類特殊的方法將只之前的任何一次所謂的實例是在創建任何方法(類或實例)之前創建的。