Как мне создать NSArray со строковыми литералами? - PullRequest
30 голосов
/ 06 мая 2010

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

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

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

Ответы [ 6 ]

70 голосов
/ 08 февраля 2013

Новый синтаксис для создания массива со строковыми литералами:

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

Чтобы исправить ошибку, код должен быть в методе. Если вы хотите использовать его статически, создайте метод класса, следующий шаблону синглтона.

18 голосов
/ 06 мая 2010

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

7 голосов
/ 07 мая 2010

Похоже, Чак заметил проблему. Хотя при кодировании вашего решения вы должны знать одну вещь: вам следует избегать хранения автоматически выпущенного экземпляра 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;
}
3 голосов
/ 22 мая 2012

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

См. здесь и здесь

2 голосов
/ 06 мая 2010

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

NSArray * currency = [[NSArray alloc] initWithObjects: @ "Dollar", @ "Euro", @ "Pound", nil];

Я не уверен, что.

0 голосов
/ 06 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...