Comment dois-je déclarer un tableau comme une constante dans l'Objective-c?
Le code suivant me donne des erreurs:
// constants.h
extern NSArray const *testArray;
// constants.m
NSArray const *testArray = [NSArray arrayWithObjects: @"foo", @"bar", nil];
L'erreur que j'obtiens est
initializer element is not constant
Ou si je retire le pointeur de l'indicateur (*) j'obtiens:
statically allocated instance of Objective-C class 'NSArray'
- Voir ce DONC, la question
- Par "constantes" que voulez-vous dire? Immuable contenu de l'objet, ou l'immuable pointeur?
- Mes critères sont les suivants: 1) Les valeurs ne peuvent pas être accidentellement changé (Donc je suppose que NSArray est bon), 2) disponible n'importe où dans le programme (je suis notamment
constants.h
dans mon .pch fichier) , 3) Seulement déclaré une fois
Vous devez vous connecter pour publier un commentaire.
En bref, vous ne pouvez pas. Objective-C sont les objets, à l'exception de NSString constantes, sans ne jamais créé lors de l'exécution et, par conséquent, vous ne pouvez pas utiliser une expression pour les initialiser.
Il y a une poignée d'approches.
(1) Déclarer
NSArray *testArray
sansconst
mot clé, puis ont un peu de code qui définit la valeur qui est appelé très tôt au cours de la vie de l'application.(2) Déclarer une classe pratique de la méthode qui retourne un tableau, puis d'utiliser un
static NSArray *myArray
à l'intérieur de cette méthode et de la traiter comme un singleton (une recherche pour "objective-c singleton" pour sur un tas de réponses sur la façon d'instancier).NSStrings
comme dans la question, vous pouvez créer unC
style de tableau dans votre fichier de constantes et ensuite utiliser certainsC
méthodes de là à y accéder. Voir ma réponse ci-dessous@[...]
sucre, oui?Un peu en retard à la fête, mais puisque vous n'êtes pas à modifier les valeurs par le biais de cours du programme, si vous ne traitez avec des chaînes, vous pouvez faire ce qui suit en déclarant votre tableau à l'aide d'un
C
tableau:dans votre
constants.h
fichier, puis dans votreconstants.m
vous pouvez ajouter des objets comme:Ensuite, pour accéder à un membre, vous pouvez faire une boucle for comme avec unC
sizeof()
opérateur:Ce qui est évidemment un
C
tableau et pas unNSArray
si vous n'obtenez pas toutes les méthodes amusantes attaché à elle commeobjectAtIndex:
, vous pouvez donc créer une fonction d'aide quelque part dans votre programme qui boucle sur toutes les chaînes à l'aide de la méthode que j'ai décrite ci-dessus et renvoie unNSArray
(ouNSMutableArray
même). Mais, si vous faites ce que je suis et juste besoin d'une constante tableau deNSString
valeurs à utiliser tout au long de votre programme, cette méthode fonctionne le mieux.Le faisant de cette façon dépeint l'ensemble de votre tableau de chaîne de contants dans
constants.h
, et est toujours disponible tout au long de votre programme par l'ajout deconstants.h
dans votre.pch
fichier au lieu de créer un singleton juste pour ce tableau de valeurs ou de réglage de la matrice avec un peu de code, qui sorta de défaites le but d'unconstants
fichier, car elle élimine les réelles constantes de laconstants
fichier..ÉDITION par @JesseGumpo Commentaire:
Car il peut y avoir des problèmes avec l'utilisation de
sizeof()
pour déterminer la taille du tableau, une solution simple est de déclarer la taille du tableau dans votre fichier de constantes comme suit:Et pour accéder aux membres d'une boucle for, vous pouvez le faire comme ceci:
Oui, ce n'est pas dynamiquement la capture de la taille de la matrice, mais si vous êtes à la déclaration d'un tableau dans un fichier de constantes, vous connaissez déjà la taille de ce tableau depuis le début, donc, même si elle ajoute deux lignes de code, il encore accomplit la tâche de créer un tableau dans un fichier de constantes.
Si quelqu'un a des suggestions ou connaître quelques autres
C
astuces veuillez laisser un commentaire ci-dessous!sizeof()
. D'éditer ma réponse pour refléter mon approche finale, qui, depuis qu'elle est à l'aide de types de données simples, fonctionne toujours et accomplit la tâche de créer un tableau dans un fichier de constantes.Voici une macro pour le faire en une seule ligne pour une instance statique dans la portée de la méthode.
Exemple d'utilisation
Comme pour moi, il est plus commode d'utiliser la suite de la mise en œuvre d'un tableau de constantes
Il est assez facile :
#define arrayTitle [NSArray arrayWithObjects: @"hi",@"foo",nil]
mettre avant la mise en œuvre et sans point-virgule.
espère que cela aide.
arrayTitle
,arrayTitle
dans le code n'importe où, il va affecter une nouvelle instance de la matrice et de le remplir avec des objets. C'est beaucoup de répartition du trafic qui est complètement inutile.J'ai un fichier d'en-tête appelé "Constantes.h" et dans la prochaine constante des tableaux:
Fondamentalement, lorsque vous appelez arrayOfStrings dans votre code, est remplacé par @[@"1", @"2", @"3", @"4"] et la même chose avec arraysOfIds.
arrayOfStrings
ouarraysOfIds
est mentionné.