¿Cómo declaro una matriz como una constante en Objective-c?

El siguiente código me está dando errores:

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

El error que obtengo es
initializer element is not constant

O si elimino el indicador del puntero (*), obtengo:
statically allocated instance of Objective-C class 'NSArray'

En resumen, no puedes. Los objetos Objective-C, con la excepción de las constantes NSString, solo se crean en el tiempo de ejecución y, por lo tanto, no se puede usar una expresión para inicializarlos.

Hay un puñado de enfoques.

(1) Declare NSArray *testArray sin la palabra clave const y luego tenga un bit de código que configure el valor que se invoca muy temprano durante el ciclo de vida de la aplicación.

(2) Declare un método de clase conveniente que devuelva el conjunto, luego use un static NSArray *myArray dentro de ese método y trátelo como un singleton (busque SO para “singleton objective-c” para aproximadamente un trillón de respuestas sobre cómo crear instancias).

Un poco tarde para la fiesta, pero como no está cambiando los valores durante el curso del progtwig, si solo estaba tratando con cadenas, podría hacer lo siguiente declarando su matriz usando una matriz C :

 extern NSString * const MY_CONSTANT_STRING_ARRAY[]; 

en su archivo constants.h , y luego en sus constants.m , podría agregar objetos a él de esta manera:

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

Luego, para acceder a un miembro, puede hacer un ciclo for como con un operador C sizeof() :

Obviamente, esta es una matriz C y no una NSArray por lo que no se le objectAtIndex: todos los métodos divertidos como objectAtIndex: así que podría crear una función auxiliar en algún lugar de su progtwig que recorra todas las cadenas usando el método I descrito anteriormente y devuelve un NSArray (o NSMutableArray incluso). Pero, si estuvieras haciendo lo que soy y solo necesitas una matriz constante de valores de NSString para usar en todo tu progtwig, este método funciona mejor.

Al hacerlo de esta manera, encapsula todos los contantes de matriz de cadenas en constants.h , y todavía está disponible en todo el progtwig agregando constants.h en su archivo .pch lugar de crear un singleton solo para esta matriz de valores o establecer la matriz con un pequeño código, que sorta derrota el propósito de un archivo de constants porque elimina las constantes reales del archivo de constants .

EDIT por el comentario de @ JesseGumpo :

Dado que puede haber problemas con el uso de sizeof() para determinar el tamaño de la matriz, una solución simple es declarar el tamaño de la matriz en su archivo de constantes de la siguiente manera:

 //.h extern int SIZE_OF_MY_CONSTANTS_ARRAY; ///.m int SIZE_OF_MY_CONSTANTS_ARRAY = 2; 

Y luego para acceder a los miembros en un ciclo for puedes hacerlo así:

 for (int i=0; i < SIZE_OF_MY_CONSTANTS_ARRAY; i++) NSLog(@"my constant string is: %@", MY_CONSTANT_STRING_ARRAY[i]); 

Sí, esto no captura dinámicamente el tamaño de la matriz, pero si declara una matriz en un archivo de constantes, ya conoce el tamaño de esa matriz desde el principio, por lo que aunque agrega dos líneas más de código, aún cumple la tarea de tener una matriz en un archivo de constantes.

Si alguien tiene más sugerencias o puede conocer algunos otros trucos de C por favor deje un comentario a continuación!

Aquí hay una macro para hacerlo en una línea para una instancia estática en un scope de método.

 #define STATIC_ARRAY(x, ...) \ static NSArray* x=nil; \ static dispatch_once_t x##onceToken; \ dispatch_once(&x##onceToken, ^{ x = @[ __VA_ARGS__ ]; }); 

Use el ejemplo

  STATIC_ARRAY(foo, @"thing1", @"thing2", [NSObject new]); 

Es bastante fácil:

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

poner antes de la implementación y sin punto y coma.

Espero eso ayude.

En cuanto a mí, es más conveniente usar la siguiente implementación para una matriz de constantes

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

Tengo un archivo de encabezado llamado “Constantes.h” y dentro de las siguientes matrices constantes:

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

Básicamente, cuando llama a arrayOfStrings en su código, se reemplaza con @ [@ “1”, @ “2”, @ “3”, @ “4”] y lo mismo con arraysOfIds.