从另一个常量不起作用构建的常量

时间:2014-01-06 16:52:13

标签: ios objective-c nsarray

我开始深入研究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的问题找到答案。 (他正在使用一个类作为他的常量,因为我的程序很简单,可以包含在与main方法相同的文件中。)

3 个答案:

答案 0 :(得分: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类方法是一种特殊的类方法,只能在创建任何实例之前或调用任何方法(类或实例)之前调用一次。

答案 1 :(得分: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];
}

答案 2 :(得分:-1)

正确的方法是在对象的init方法中执行,或

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

但我不推荐这个。