Как объявить массив как константу в 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 ответов:
короче говоря, вы не можете. объекты 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 вот так сC
sizeof()
оператор:это, очевидно, является
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.