iphone - usa - ¿Cómo creo un NSArray con literales de cadena?



objective-c macos (4)

Aunque esto es antiguo, tenga en cuenta que Apple ha asignado un nuevo parche al proyecto llvm que agrega compatibilidad con la nueva sintaxis literal de Objective-C para NSArray , NSDictionary y NSNumber .

Mira here y here

Estoy intentando crear un NSArray con una agrupación de literales de cadenas; sin embargo, aparece el error de compilación "El elemento inicializador no es constante".

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

¿Podría alguien señalar lo que estoy haciendo mal, y posiblemente explicar el mensaje de error?


Esto no es un problema con la creación de NSArray en sí (en su lugar, aparecería el mismo error si escribiera [NSArray array] ), pero con el lugar donde lo ha escrito. Supongo que se trata de un NSArray global o de archivos estáticos. En C, ese tipo de variable debe tener un inicializador constante, lo que significa que no es una llamada de función (o, por extensión, una llamada de método). La solución es colocar la creación y la asignación reales de la matriz en un método al que se llamará antes de que necesite la matriz, como initialize .


Nueva sintaxis para crear una matriz con literales de cadena:

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

Para corregir su error de complicación, el código debe estar en un método. Si desea usarlo de forma estática, cree un método de clase que siga el patrón de singleton.


Parece que Chuck ha detectado el problema. Sin embargo, una cosa que debe tener en cuenta al codificar su solución es que deseará evitar almacenar una instancia lanzada automáticamente de NSArray en una variable estática. Además, un patrón común para estas situaciones es escribir un método de clase que crea y devuelve el valor almacenado en la variable estática, así:

+ (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;
}




macos