Créer une classe d'ensemble d'objets

Bonjour, excusez cette question qui paraitra pour certain surement anodine et peut être un peu bête, mais la je pêche un peu... J'ai un programme qui reçoit un fichier XML (emploi du temps) et donc quand je le parse je stocke les éléments directement dans des objets j'ai donc 3 classes: root, semaine, jour et cours.

Seulement quand je parse mon XML j'ai seulement les dernières valeurs du XML qui sont sauvegardé dans les attributs de ces classes... Quel est (par exemple lorsque je fais mon héritage de cours à  jour) la syntaxe pour en faire un tableau d'objet, actuellement j'ai :











#import <Foundation/Foundation.h>


#import "cours.h"




@interface jour : cours{

NSString *jour ;

NSString *name ;

}



@property NSString *jour ;

@property NSString *name ;

@end






En Java, ce que je voudrais faire s'écrirait par exemple (a peu de chose près):

public class jour extends ArrayList<cours> {

}



Merci d'avance pour l'intérêt que vous porterez à  ce post et à  vos réponses image/smile.png' class='bbc_emoticon' alt=':)' />

Nico

Réponses

  • Salut ! Premier petit conseil, par convention le nom de tes classes doit commencer par une majuscule:


    <br />
    @interface Jour : Cours{<br />
    NSString *_jour;<br />
    NSString *_name;<br />
    }<br />
    @property (nonatomic, retain) NSString *jour;<br />
    @property (nonatomic, retain) NSString *name;<br />
    




    ensuite dans la boucle qui parse ton XML, tu mets tes objects dans un tableau:


    <br />
    	// fetch xml<br />
    	NSDictionary *xmlDictionary = ....<br />
    	// create array<br />
    	NSMutableArray *results = [[NSMutableArray alloc] init];<br />
    	// fill array<br />
    	for (NSDictionary *anItem in xmlDictionary) {<br />
    		Cours *newCours = [[Cours alloc] init];<br />
    		newCours.name = [anItem objectForKey:@&quot;name&quot;];<br />
    		newCours.jour = [anItem objectForKey:@&quot;jour&quot;];<br />
    		[results addObject:newCours];<br />
    		[newCours release];<br />
    	}<br />
      <br />
    	// enjoy your filled array <img src='http://forum.cocoacafe.fr/public/style_emoticons/<#EMO_DIR#>/wink.png' class='bbc_emoticon' alt=';)' /><br />
    
  • Ouh que ce code m'a l'air complexe encore a mon niveau, je vais l'étudier et dire si quelque chose me pose problème. Merci pour les conventions image/smile.png' class='bbc_emoticon' alt=':)' />

    Ptite question: le "_" devant le nom de mes variables consiste en quoi? Merci d'avance, et encore merci pour ta réponse image/smile.png' class='bbc_emoticon' alt=':)' />
  • Le"_" est une convention pour désigner les variables d'instances, c'est-à -dire les variables internes à  une classe.
  • Merci draken image/smile.png' class='bbc_emoticon' alt=':)' />
  • 'igreg' a écrit:


    ensuite dans la boucle qui parse ton XML, tu mets tes objects dans un tableau:


    <br />
    	// fetch xml<br />
    	NSDictionary *xmlDictionary = ....<br />
    	// create array<br />
    	NSMutableArray *results = [[NSMutableArray alloc] init];<br />
    	// fill array<br />
    	for (NSDictionary *anItem in xmlDictionary) {<br />
    		Cours *newCours = [[Cours alloc] init];<br />
    		newCours.name = [anItem objectForKey:@&quot;name&quot;];<br />
    		newCours.jour = [anItem objectForKey:@&quot;jour&quot;];<br />
    		[results addObject:newCours];<br />
    		[newCours release];<br />
    	}<br />
    





    Voici mon code:
    <br />
    - (void)parser:(NSXMLParser *)parser<br />
    didStartElement:(NSString *)elementName<br />
      namespaceURI:(NSString *)namespaceURI<br />
    qualifiedName:(NSString *)qName<br />
    attributes:(NSDictionary *)attributeDict<br />
    {<br />
    NSLog(@&quot;Open tag: %@&quot;, elementName);<br />
    if([elementName isEqualToString:@&quot;root&quot;]) {<br />
    	   <br />
    	    // fetch xml<br />
    	    NSDictionary *xmlDictionary = .... ;<br />
    	    // create array<br />
    	    NSMutableArray *results = [[NSMutableArray alloc] init];<br />
    	    // fill array<br />
    	    for (NSDictionary *anItem in xmlDictionary) {<br />
    		    Semaine *newCours = [[Semaine alloc] init];<br />
    		    newCours.name = [anItem objectForKey:@&quot;name&quot;];<br />
    		    newCours.jour = [anItem objectForKey:@&quot;jour&quot;];<br />
    		    [results addObject:newCours];<br />
    		    NSLog(@&quot;name.newCours = %@ &quot;, newCours.name);<br />
    	    }<br />
    }<br />
    else {<br />
      currentNodeName = [elementName copy];<br />
      currentNodeContent = [[NSMutableString alloc] init];<br />
    }<br />
    }<br />
    - (void)parser:(NSXMLParser *)parser<br />
    didEndElement:(NSString *)elementName<br />
      namespaceURI:(NSString *)namespaceURI<br />
    qualifiedName:(NSString *)qName<br />
    {<br />
    NSLog(@&quot;Close tag: %@&quot;, elementName);<br />
    if([elementName isEqualToString:className]) {<br />
     // [items addObject:item];<br />
      //item = nil;<br />
    }<br />
    else if([elementName isEqualToString:currentNodeName]) {<br />
    	    // use key-value coding<br />
      [item setValue:currentNodeContent forKey:elementName];<br />
    	   <br />
      currentNodeContent = nil;<br />
      currentNodeName = nil;<br />
    }<br />
    }<br />
    




    Je suis vraiment perdu la, a quoi sert le NSDictionnary? Comment intégré le xml dans celui ci, je comprend pas ce que tu veux faire... Ton morceau de code devrait remplacer le mien non?
  • CéroceCéroce Membre, Modérateur
    décembre 2012 modifié #8
    L'équivalent de ArrayList est la classe NS(Mutable)Array.

    Par contre, la démarche est différente de l'exemple que tu donnes, dans le sens où on ne vas pas hériter de NSMutableArray (c'est une très mauvaise idée). On va plutôt créer une classe Jour qui possèdera une variable d'instance de type NSMutableArray:


    @interface Jour:NSObject<br />
    @property (strong) NSMutableArray *cours; // Liste de Cours<br />
    @end<br />
    
  • iTogueshiToguesh Membre
    décembre 2012 modifié #9
    'Céroce' a écrit:


    L'équivalent de ArrayList est la classe NS(Mutable)Array.

    Par contre, la démarche est différente de l'exemple que tu donnes, dans le sens où on ne vas pas hériter de NSMutableArray (c'est une très mauvaise idée). On va plutôt créer une classe Jour qui possèdera une variable d'instance de type NSMutableArray:


    @interface Jour:NSObject<br />
    @property (strong) NSMutableArray *cours; // Liste de Cours<br />
    @end<br />
    





    Oui mais comme ça je ne peux pas accéder à  mes attributs de cours par exemple...?
  • CéroceCéroce Membre, Modérateur
    décembre 2012 modifié #10
    Ben si:
    Cours *cours = [jour.cours objectAtIndex:3];<br />
    cours.name = @&quot;Géographie&quot;;
    
  • iTogueshiToguesh Membre
    décembre 2012 modifié #11
    'Céroce' a écrit:


    Ben si:
    Cours *cours = [jour.cours objectAtIndex:3];<br />
    cours.name = @&quot;Géographie&quot;;
    



    Oui mais c'est pas possible ^^' Voila un XML généré par le webService:
    <br />
    &lt;?xml version=&quot;1.0&quot; encoding=&quot;iso-8859-1&quot; ?&gt;<br />
    &lt;root&gt;<br />
    &lt;generated&gt;06122012T14:55:44&lt;/generated&gt;<br />
    &lt;semaine&gt;<br />
    	&lt;semaine_numero&gt;48&lt;/semaine_numero&gt;<br />
    &lt;jour name=&quot;Lundi 3 D&amp;eacute;cembre 2012&quot;&gt;<br />
    &lt;cours&gt;<br />
    &lt;timestamp&gt;03122012T0900E1300&lt;/timestamp&gt;<br />
      &lt;start&gt;09:00&lt;/start&gt;<br />
      &lt;end&gt;13:00&lt;/end&gt;<br />
      &lt;intitule&gt;Licence Pro Formation Init - R202 Q103<br />
    CTD<br />
    Projets tuteurés<br />
    Hoang TRAN-DINH Salle machine B1-12&lt;/intitule&gt;<br />
    &lt;/cours&gt;<br />
    &lt;cours&gt;<br />
    &lt;timestamp&gt;03122012T1400E1800&lt;/timestamp&gt;<br />
      &lt;start&gt;14:00&lt;/start&gt;<br />
      &lt;end&gt;18:00&lt;/end&gt;<br />
      &lt;intitule&gt;Licence Pro Formation Init - R202 Q103<br />
    CTD<br />
    Projets tuteurés<br />
    Hoang TRAN-DINH Salle machine B1-12&lt;/intitule&gt;<br />
    &lt;/cours&gt;<br />
    &lt;/jour&gt;<br />
    &lt;jour name=&quot;Mardi 4 D&amp;eacute;cembre 2012&quot;&gt;<br />
    &lt;cours&gt;<br />
    &lt;timestamp&gt;04122012T0900E1000&lt;/timestamp&gt;<br />
      &lt;start&gt;09:00&lt;/start&gt;<br />
      &lt;end&gt;10:00&lt;/end&gt;<br />
      &lt;intitule&gt;Licence Pro Formation Init - T206  <br />
    CTD<br />
    Programmation objet 2 (java graphique)<br />
    Sylvie SZULMAN&lt;/intitule&gt;<br />
    &lt;/cours&gt;<br />
    &lt;cours&gt;<br />
    &lt;timestamp&gt;04122012T1000E1230&lt;/timestamp&gt;<br />
      &lt;start&gt;10:00&lt;/start&gt;<br />
      &lt;end&gt;12:30&lt;/end&gt;<br />
      &lt;intitule&gt;Licence Pro Formation Init - R200  <br />
    CTD<br />
    Programmation objet 2 (java graphique)<br />
    Sylvie SZULMAN&lt;/intitule&gt;<br />
    &lt;/cours&gt;<br />
    &lt;cours&gt;<br />
    &lt;timestamp&gt;04122012T1345E1645&lt;/timestamp&gt;<br />
      &lt;start&gt;13:45&lt;/start&gt;<br />
      &lt;end&gt;16:45&lt;/end&gt;<br />
      &lt;intitule&gt;Licence Pro Formation Init - T206  <br />
    CTD<br />
    Anglais<br />
    Terri Simoneau-Berquez&lt;/intitule&gt;<br />
    &lt;/cours&gt;<br />
    &lt;/jour&gt;<br />
    &lt;jour name=&quot;Mercredi 5 D&amp;eacute;cembre 2012&quot;&gt;<br />
    &lt;cours&gt;<br />
    &lt;timestamp&gt;05122012T0900E1300&lt;/timestamp&gt;<br />
      &lt;start&gt;09:00&lt;/start&gt;<br />
      &lt;end&gt;13:00&lt;/end&gt;<br />
      &lt;intitule&gt;Licence Pro Formation Init - R300  <br />
    CTD<br />
    Internet 1 (PHP)<br />
    Lilian GIBERT&lt;/intitule&gt;<br />
    &lt;/cours&gt;<br />
    &lt;cours&gt;<br />
    &lt;timestamp&gt;05122012T1400E1700&lt;/timestamp&gt;<br />
      &lt;start&gt;14:00&lt;/start&gt;<br />
      &lt;end&gt;17:00&lt;/end&gt;<br />
      &lt;intitule&gt;Licence Pro Formation Init - R305  <br />
    GEN<br />
    Langages de développement Internet<br />
    Haà¯fa ZARGAYOUNA user-study on semantic web tools : Andéol, Sylvain, Anthony, Finnbar, Benoà®t, Romain&lt;/intitule&gt;<br />
    &lt;/cours&gt;<br />
    &lt;/jour&gt;<br />
    &lt;jour name=&quot;Jeudi 6 D&amp;eacute;cembre 2012&quot;&gt;<br />
    &lt;/jour&gt;<br />
    &lt;jour name=&quot;Vendredi 7 D&amp;eacute;cembre 2012&quot;&gt;<br />
    &lt;/jour&gt;<br />
    &lt;jour name=&quot;Samedi 8 D&amp;eacute;cembre 201&quot;&gt;<br />
    &lt;/jour&gt;<br />
    &lt;/semaine&gt;<br />
    &lt;/root&gt;<br />
    




    Tu vois, à  partir de là  c'est difficile de naviguer où je veux par ta méthode..

    Pour bien faire il faudrait que je puisse faire un truc du genre:

    NSLog(@Le prochain cours sera: %@",[currentSemaine.jour atIndex[1cours atIndex[3]] intitule]);

    Bon tokay j'dois être pessimiste au vue de mes capacités mais j'veux pouvoir y accéder assez simplement...

    Et moi qui disais que le Java c'était un langage d'intellos, finalement j'me demande lequel... image/xd-laugh.gif' class='bbc_emoticon' alt='xd' />
  • CéroceCéroce Membre, Modérateur
    décembre 2012 modifié #12
    'iToguesh' a écrit:


    Tu vois, à  partir de là  c'est difficile de naviguer où je veux par ta méthode..


    Non, je ne vois pas. Effectivement, les objets d'un NSMutableArray ne sont pas typés comme en Java, mais ça ne change pas grand chose. Tu dois juste dire de quel type est l'objet qui sort du NSMutableArray.
  • Voici les classes avec leurs attributs, les *.m ne contiennent que les @synthetise:


    <br />
    #import &quot;semaine.h&quot;<br />
    @interface Root : Semaine{<br />
    	NSString *generated ;<br />
    }<br />
    @property NSString *generated ;<br />
    @end<br />
    

    <br />
    #import &quot;jour.h&quot;<br />
    @interface Semaine : Jour{<br />
    	NSString *_semaine_numero ;<br />
    }<br />
    @property NSString* semaine_numero ;<br />
    @end<br />
    

    <br />
    <br />
    #import &quot;cours.h&quot;<br />
    @interface Jour : Cours{<br />
    	NSString *_jour ;<br />
    	NSString *_name ;<br />
    }<br />
    @property NSString *jour ;<br />
    @property NSString *name ;<br />
    @end<br />
    

    <br />
    @interface Cours : NSObject{<br />
    	NSString *_timestamp ;<br />
    	NSString *_start ;<br />
    	NSString *_end ;<br />
    	NSString *_intitule ;<br />
    }<br />
    @property NSString *timestamp ;<br />
    @property NSString *start ;<br />
    @property NSString *end ;<br />
    @property NSString *intitule ;<br />
    @end<br />
    




    Et voici le parseur que j'ai utilisé (
    XMLToObjectParser)


    : http://www.jkraft.fr...un-fichier-xml/

    J'ai vraiment du mal à  comprendre, j'attend juste du code commenté qui m'explique ce que je fais mal et la bonne façon de faire. Je remercie d'avance ceux qui prendront le temps de m'aider et remercie ceux qui ont déja penché sur ce problème...



    Voici ma méthode qui appel le parseur:
    <br />
    -(void)syncEDT:(NSString *)login :(NSString *)pass{<br />
    	NSString *urlIUT = [NSString stringWithFormat:@&quot;https://ssl15.ovh.net/~f****arr/ent/?login=%@&amp;pass=%@&quot;, login, pass];<br />
    	NSURL *url = [NSURL URLWithString: urlIUT];<br />
    <br />
    XMLToObjectParser *myParser = [[XMLToObjectParser alloc]<br />
    								   parseXMLAtURL:url toObject:@&quot;Root&quot; parseError:nil];<br />
    	NSMutableArray *tableauJour = [[NSMutableArray alloc] init];<br />
      <br />
    	NSLog(@&quot;%u&quot;, [tableauJour count]);<br />
    for(int i = 0; i &lt; [[myParser items] count]; i++) {<br />
    		Jour *nouveauJour;<br />
    		nouveauJour = (Root *)[[myParser items] objectAtIndex:i];<br />
    		[tableauJour addObject:nouveauJour];<br />
    		NSLog(@&quot;%@&quot;, nouveauJour.name);<br />
    	}<br />
    }<br />
    @end<br />
    
  • AliGatorAliGator Membre, Modérateur
    décembre 2012 modifié #14
    Pas forcément a voir avec la question d'origine, mais sache qu'il est totalement inutile de déclarer à  la fois les variables d'instance (dans le bloc entre accolades après le @interface) et les @property. Créer une @property va automatiquement générer si besoin une variable d'instance associée et le tout sera transparent pour toi (perso ça fait une éternité que j'ai pas déclaré explicitement de variable d'instance)



    Donc au lieu de
    @interface Jour : NSObject<br />
    {<br />
        NSArray* _cours;<br />
    }<br />
    @property NSArray* cours;<br />
    @end
    
    Tu peux te passer de déclarer la variable d'instance _cours et te contenter de cette déclaration :
    @interface Jour : NSObject<br />
    @property NSArray* cours;<br />
    @end
    
    Tu peux donc faire le ménage dans la déclaration de toutes tes variables d'instance et ne garder que les @property correspondant, ça va alléger ton code !
  • 'AliGator' a écrit:


    Pas forcément a voir avec la question d'origine, mais sache qu'il est totalement inutile de déclarer à  la fois les variables d'instance (dans le bloc entre accolades après le @interface) et les @property. Créer une @property va automatiquement générer si besoin une variable d'instance associée et le tout sera transparent pour toi (perso ça fait une éternité que j'ai pas déclaré explicitement de variable d'instance)


    Merci pour l'astuce Ali =)
Connectez-vous ou Inscrivez-vous pour répondre.