Как создать NSArray со строковыми литералами?
Я пытаюсь создать NSArray с группировкой строковых литералов, однако я получаю ошибку компиляции. Элемент Initializer не является константой.
NSArray *currencies = [NSArray arrayWithObjects:@"Dollar", @"Euro", @"Pound", nil];
Может ли кто-нибудь указать, что я делаю неправильно, и, возможно, объяснить сообщение об ошибке?
Ответы
Ответ 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
Нет ничего плохого в этом коде. Вы уверены, что в этой строке создается ошибка?