Как объявить массив как константу в Objective-c?


следующий код дает мне ошибки:

//  constants.h
extern NSArray const *testArray;
//  constants.m
NSArray const *testArray = [NSArray arrayWithObjects:  @"foo", @"bar", nil];

ошибка, которую я получаю
initializer element is not constant

или если я уберу указатель индикатора ( * ) я получаю:
statically allocated instance of Objective-C class 'NSArray'

6 59

6 ответов:

короче говоря, вы не можете. объекты Objective-C, за исключением констант NSString, создаются только во время выполнения и, таким образом, вы не можете использовать выражение для их инициализации.

есть несколько подходов.

(1) объявить NSArray *testArray без const ключевое слово, а затем есть немного кода, который устанавливает значение, которое вызывается очень рано в течение жизненного цикла приложения.

(2) объявлять удобный метод класса, который возвращает массив, затем используйте static NSArray *myArray в этом методе и рассматривать его как синглтон (поиск так для "objective-C singleton" около миллиона ответов о том, как создать экземпляр).

немного поздно на вечеринку, но поскольку вы не меняете значения в ходе программы, если бы вы имели дело только со строками, вы могли бы сделать следующее, объявив свой массив с помощью C время:

extern NSString * const MY_CONSTANT_STRING_ARRAY[];

в своем , а затем в constants.m вы можете добавить объекты к нему так:

NSString * const MY_CONSTANT_STRING_ARRAY[] = { @"foo", @"bar" };

затем, чтобы получить доступ к члену, вы можете сделать цикл for вот так с Csizeof() оператор:

это, очевидно, является C массив, а не NSArray так что вы не получите все весело методы, прикрепленные к нему, как objectAtIndex:, так что вы можете создать вспомогательную функцию где-то в вашей программе, которая перебирает все строки с помощью метода, описанного выше, и возвращает NSArray (или NSMutableArray даже). Но, если вы делали то, что я и просто нужен постоянный массив NSString значения для использования во всей программе, этот метод работает лучший.

делая это таким образом инкапсулирует все ваши строки массива контентов в constants.h, и по-прежнему доступен во всей вашей программе, добавив constants.h в своем .pch файл вместо того, чтобы создавать синглтон только для этого массива значений или устанавливать массив с небольшим кодом, который вроде бы побеждает цель constants файл, потому что он удаляет фактические константы из

вот макрос, чтобы сделать это в одной строке для статического экземпляра в области метода.

#define STATIC_ARRAY(x, ...)   \
        static NSArray* x=nil; \
        static dispatch_once_t x##onceToken; \
        dispatch_once(&x##onceToken, ^{ x = @[ __VA_ARGS__ ]; });
использовать
    STATIC_ARRAY(foo, @"thing1", @"thing2", [NSObject new]);

Это довольно легко :

#define arrayTitle [NSArray arrayWithObjects: @"hi",@"foo",nil]

поставить перед реализацией и без точки с запятой.

надеюсь, что это помогает.

Что касается меня, то удобнее использовать следующую реализацию для массива констант

static NSString * kHeaderTitles [3] = {@ "ACCOUNT DETAILS", @ "SOCIAL NETWORK", @ "SETTINGS"};
static int kNumbers[3] = {1, 2, 3};

У меня есть заголовочный файл с именем "константы.h " И в следующих постоянных массивах:

#define arrayOfStrings @[@"1", @"2", @"3", @"4"]
#define arraysOfIds @[@(1), @(2), @(3), @(4)]

в основном, когда вы вызываете arrayOfStrings в своем коде, заменяется на @[@"1", @"2", @"3", @"4"] и то же самое с arraysOfIds.