2012-06-15 4 views

Répondre

7

Il n'est pas possible de créer un tableau comme vous le faites au moment de la compilation. C'est parce que ce n'est pas une "constante de temps de compilation". Au lieu de cela, vous pouvez faire quelque chose comme:

static NSArray *tArray = nil; 

-(void)viewDidLoad { 
    [super viewDidLoad]; 

    tArray = [NSArray arrayWithObjects:@"A", @"B", @"C", nil]; 
} 

S'il est vraiment important que vous avez cette précompilés, alors je suppose que vous pouvez créer un projet de test, créer le tableau (ou tout autre objet) dont vous avez besoin, remplissez-le, puis sérialisez-le en utilisant NSKeyedArchiver (qui l'enregistrera dans un fichier), puis incluez ce fichier dans votre application. Vous devrez ensuite utiliser NSKeyedUnarchiver pour désarchiver l'objet à utiliser. Je ne suis pas sûr de la différence de performance entre ces deux approches. Un avantage de cette méthode est que vous n'avez pas un gros bloc de code si vous avez besoin d'initialiser un tableau qui inclut beaucoup d'objets.

+0

Il n'est pas important de le faire précompiler, donc votre solution fonctionne parfaitement pour moi. Merci! – MoreFamed

+0

Cela crée le tableau chaque fois que 'viewDidLoad' s'exécute, un test' nil' serait bon. – Cristik

-1

utilisent ce

NSArray *array = [NSArray arrayWithObjects:str1,str2, nil]; 
+1

À noter que 'str1, str2 ...' peut être des littéraux NSString comme '@ 'une certaine chaîne" ', de la même façon que pour un initialiseur de tableau C. Je * pense * que de telles chaînes seront initialisées au moment de la compilation dans l'image. Ne pensez pas que vous pouvez init le tableau lui-même autre que lors de l'exécution, cependant, au moins pas sans un hack de sérialisation laide. – walkytalky

+0

Cela ne fonctionne pas pour moi. J'ai fait NSArray * a = [NSArray arrayWithObjects: @ "foo", @ "bar", @ "baz", nil]; et le compilateur dit "l'élément Initializer n'est pas une constante de compilation". J'ai besoin de partager le tableau entre plusieurs routines dans un module, donc je veux que le tableau soit déclaré et rempli en dehors de toute routine ... – MoreFamed

+0

-1 Comme l'a souligné MoreFamed, cela ne fonctionnera absolument pas comme il le devrait. Votre code * fonctionnerait s'il avait seulement besoin d'accéder à 'array' dans une seule méthode, mais il a besoin d'y accéder tout au long de sa classe. – FreeAsInBeer

-2

Pour autant que je comprends que vous avez besoin d'un tableau à une dimentionnelle Vous pouvez utiliser les méthodes de classe de NSArray .. Par exemple

NSString *yourString; 
NSArray *yourArray = [[NSArray alloc] initWithObjects:yourString, nil]; 

Si vous avez besoin de plus, s'il vous plaît donnez plus de détails sur votre problème

+0

-1 Votre réponse a le même problème que @ sheraza. Cela ne va pas donner accès au tableau à travers toute la classe. – FreeAsInBeer

-2

Simple comme ça: NSArray<NSString*> *stringsArray = @[@"Str1", @"Str2", @"Str3", ...]; Modern ObjectiveC permet les génériques et les tableaux littéraux.

Si vous voulez un code plus court, alors NSArray *stringsArray = @[@"Str1", @"Str2", @"Str3", ...];, car les génériques sont optionnels et ne sont utiles que lors de l'accès aux éléments du tableau, vous pouvez donc plus tard dans le code retourner au tableau modélisé.

+1

Je ne peux pas le compiler comme constant/statique. – Andy

+0

Oui, cela ne fonctionnera pas car il s'agit d'une construction exécutée à l'exécution. – Cristik

Questions connexes