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?
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
.
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.
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;
}
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.
Il n'y a rien de mal avec ce code. Etes-vous sûr que l'erreur est produite à cette ligne?