web-dev-qa-db-fra.com

Comment créer un NSArray avec des littéraux de chaîne?

J'essaie de créer un NSArray avec un groupe de littéraux de chaîne, mais l'erreur de compilation "L'élément d'initialiseur n'est pas constant" s'affiche.

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

Quelqu'un pourrait-il indiquer ce que je fais de travers et éventuellement expliquer le message d'erreur?

30
Kyle

Ce n'est pas un problème avec la création de NSArray elle-même (vous obtiendrez la même erreur si vous écriviez plutôt [NSArray array]), mais avec l'endroit où vous l'avez écrit. J'imagine qu'il s'agit d'un NSArray global ou statique. En C, ce type de variable doit avoir un initialiseur constant - ce qui signifie pas un appel de fonction (ou, par extension, un appel de méthode). La solution consiste à placer la création et l’affectation réelles du tableau dans une méthode qui sera appelée avant que vous n’ayez besoin du tableau, telle que initialize.

18
Chuck

Nouvelle syntaxe pour créer un tableau avec des littéraux de chaîne:

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

Pour corriger votre erreur de complication, le code doit être dans une méthode. Si vous voulez l'utiliser de manière statique, créez une méthode de classe qui suit le modèle singleton.

69
malhal

On dirait que Chuck a repéré le problème. Une chose que vous devez prendre en compte lors du codage de votre solution est d'éviter de stocker une instance auto-libérée de NSArray dans une variable statique. En outre, un modèle courant pour ces situations consiste à écrire une méthode de classe qui crée et retourne la valeur stockée dans la variable statique, comme suit:

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

Bien que cette version soit ancienne, veuillez noter qu'Apple a créé un nouveau correctif dans le projet llvm en ajoutant la prise en charge de la nouvelle syntaxe littérale Objective-C pour NSArray, NSDictionary et NSNumber.

Voir ici et ici

3
microspino

Je suis un débutant dans objective-c, mais je pense que le code correct est:

NSArray * connaie = [[NSArray alloc] initWithObjects: @ "Dollar", @ "Euro", @ "Livre", nil];

Je ne suis pas sûr que.

2
Adirael

Il n'y a rien de mal avec ce code. Etes-vous sûr que l'erreur est produite à cette ligne?

0
Dave DeLong