Подтвердить что ты не робот

Как создать NSArray со строковыми литералами?

Я пытаюсь создать NSArray с группировкой строковых литералов, однако я получаю ошибку компиляции. Элемент Initializer не является константой.

NSArray *currencies = [NSArray arrayWithObjects:@"Dollar", @"Euro", @"Pound", nil];

Может ли кто-нибудь указать, что я делаю неправильно, и, возможно, объяснить сообщение об ошибке?

4b9b3361

Ответ 1

Это не проблема с самим созданием NSArray (вы получили бы ту же ошибку, если бы вместо нее написали [NSArray array]), но с тем, где вы ее написали. Я предполагаю, что это глобальный или файл-статический NSArray. В C такая переменная должна иметь постоянный инициализатор, а не вызов функции (или, по общему мнению, вызов метода). Решение состоит в том, чтобы поместить фактическое создание и назначение массива в метод, который будет вызываться до того, как вам понадобится массив, например initialize.

Ответ 2

Попробуйте эту магию:

NSArray *currencies = @[@"Dollar", @"Euro", @"Pound"];

И да, это должно быть внутри метода.

Ответ 3

Похоже, Чак заметил проблему. Одна вещь, о которой вы хотите знать, хотя при кодировании вашего решения заключается в том, что вы захотите избежать хранения экземпляра NSArray с автоопределением в статической переменной. Кроме того, общий шаблон для этих ситуаций - написать метод класса, который создает и возвращает значение, хранящееся в статической переменной, например:

+ (NSArray *)currencies
{
    static NSArray *_currencies;

    // This will only be true the first time the method is called...
    //
    if (_currencies == nil)
    {
        _currencies = [[NSArray alloc] initWithObjects:@"Dollar", @"Euro", @"Pound", nil];
    }

    return _currencies;
}

Ответ 4

Хотя это и старо, обратите внимание, что Apple применила новый патч к проекту llvm, добавляя поддержку нового синтаксиса Objective-C для NSArray, NSDictionary и NSNumber.

Смотрите здесь и здесь

Ответ 5

Я новичок в objective-c, но я думаю, что правильный код:

NSArray * currencies = [[NSArray alloc] initWithObjects: @ "Доллар", @ "Евро", "Паунд", ноль];

Я не уверен.

Ответ 6

Нет ничего плохого в этом коде. Вы уверены, что в этой строке создается ошибка?