web-dev-qa-db-fra.com

Création d'un tableau d'objets dans Objective-C.

Je joue avec XCode depuis environ 2 semaines maintenant et je lis un peu sur MVC. J'ai un problème en essayant de connecter le modèle au contrôleur parce que j'ai du mal à me déplacer dans les tableaux. Je peux gérer des tableaux simples lorsque j'en ai programmé quelques-uns en Java mais je suis intimidé par l'Obj-C NSArrays je vois.

Si quelqu'un voulait bien me montrer quelques appels simples sur un tableau d'objets, je lui en serais éternellement reconnaissant.

Mon modele:

Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject 
{
NSString *name;
NSNumber *age;
}

@property(nonatomic, retain) NSString *name;
@property(nonatomic, retain) NSNumber *age;

@end

Person.m

#import "Person.h"
@implementation Person
@synthesize name;
@synthesize age;
@end

Je l'ai gardé très simple pendant que j'essaye d'apprendre.

Maintenant ma classe de contrôleur. Ce que je veux faire, c'est créer un tableau de 40 objets "Personne". Mais je ne connais pas la bonne façon de mettre cela dans le code dans Obj C.

Controller.h

#import <Foundation/Foundation.h>
@class Person;
@interface Controller : NSObject 
{
Person *person;
}
@property(nonatomic, retain) Person *person;

-(void) doSomeWork;

@end

Controller.m

#import "Controller.h"
#import "Person.h"

@implementation Controller

@synthesize person;


-(IBAction)doSomeWork
{
// I guess here is where i should create my array of 40 person objects
}

@end

Mon problème est de savoir comment déclarer le tableau d'objets personne de taille 40. Et puis comment accéder au tableau pour y lire et y écrire.

Merci d'avance d'avoir lu mon post.

20
user440096

Voici un exemple qui crée une variable d'instance NSMutableArray dans la classe Controller et ajoute un objet Person à ce tableau chaque fois que vous évoquez doSomeWork:

@interface Controller

NSMutableArray *personArray;

@end
@implementation Controller

- (void) viewDidLoad {
    ................
    NSMutableArray *personsArray = [[NSMutableArray alloc] initWithCapacity:40];
}

- (IBAction)doSomeWork {
    Person *myPerson = [[Person alloc] init];
    myPerson.name = name;
    myPerson.age = age;

    [personsArray addObject:myPerson];
}
@end
29
ennuikiller

Les tableaux en Objective-C avec Cocoa/CocoaTouch sont très différents de Java. Les trois principales différences sont les suivantes:

  1. Les tableaux Obj-C ne sont que des classes comme les autres, et n'ont pas de support intégré dans le langage. En Java, les tableaux ont une prise en charge intégrée dans le langage via le [] les opérateurs.

  2. Les tableaux Obj-C sont non typés, ils prennent tout objet qui hérite de NSObject. Cela signifie que vous pouvez mélanger des types dans le même tableau, bien que ce soit probablement une mauvaise pratique, sauf si vous avez une très bonne raison de le faire. (Notez que int, double, char, BOOL et les autres types intégrés n'héritent pas de NSObject, donc vous ' je dois les encapsuler dans des objets NSNumber si vous avez toujours voulu les conserver dans un tableau.)

  3. Les tableaux Obj-C n'ont pas vraiment de concept de longueur fixe, sauf si le tableau entier est immuable. Vous n'avez donc pas besoin de décider de la longueur lorsque vous créez le tableau.

Pour créer un tableau mutable, c'est-à-dire celui où vous êtes autorisé à modifier les objets (et même ajouter et supprimer des objets, en modifiant la longueur du tableau), vous créez un NSMutableArray:

myArray = [[NSMutableArray alloc] init];
// Could also use initWithCapacity: 40, but not necessary.

Pour ajouter un objet, tel qu'une instance de votre Person, vous appelez le addObject:, soit en créant un nouveau Person juste là, soit en lui donnant un pointeur sur un existant:

[myArray addObject: [[[Person alloc] init] autorelease]];
[myArray addObject: someOtherPerson];
// Last line adds some other person I already had a pointer to.

Pour supprimer un objet, vous pouvez utiliser removeObjectAtIndex: ou removeLastObject. Pour remplacer, vous appelez replaceObjectAtIndex:withObject:. Pour insérer un objet au milieu de votre tableau (et rappelez-vous, cela augmentera également la taille du tableau), vous appelez insertObject:atIndex:.

Cela couvre les méthodes mutantes les plus importantes, c'est-à-dire celles spécifiques à NSMutableArray. Bien sûr, vous disposez également des méthodes qui observent uniquement un tableau, et celles-ci sont définies dans NSArray. Les plus importants sont count, donnant le nombre actuel d'éléments, et objectAtIndex:, donnant l'objet à l'index que vous fournissez.

En supposant que vous ayez des objets Person dans votre tableau, vous pouvez les parcourir comme ceci:

for (int i = 0; i < [myArray count]; i++) {
    Person* p = [myArray objectAtIndex: i];
    // Do something with p 
}

Vous pourriez vous demander comment créer un NSArray en tant que tel, si vous n'êtes pas autorisé à y ajouter. Eh bien, l'un de ses constructeurs est initWithObjects:, qui vous permet d'écrire une liste d'objets séparés par des virgules à ajouter (et vous devez terminer par une valeur nil). Un autre est initWithArray:, qui vous permet de passer un autre tableau (qui pourrait être mutable), et le constructeur utilisera les objets du tableau fourni lors de la création du nouveau.

51
harms