Tester un tableau (null)

muqaddarmuqaddar Administrateur
23:47 modifié dans API AppKit #1
J'initialise un tableau avec le contenu d'un fichier qui peut-être vide.

Je voudrais donc tester le tableau pour savoir s'il est (null) ou pas.
Je ne peux faire : if ([array count] == 0) car le tableau est vraiment vide.

De même, if (array == nil) ne semble pas bon. Quel est donc le bon moyen ? merci

Réponses

  • VeillardVeillard Membre
    23:47 modifié #2
    Et quelque chose comme :
    - (BOOL)containsObject:(id)anObject
    

  • muqaddarmuqaddar Administrateur
    mars 2005 modifié #3
    ça c'est pour tester la présence d'un objet identifié.

    EDIT :

    je fais ça :
    saveArray = [[NSMutableArray alloc] initWithContentsOfFile:filePath];

    Or le filePath peut être vide. (le contenu du fichier, le fichier est bien là  lui)

    Donc je veux tester si le tableau est plein ou vide car même si le filePah est vide, je suppose qu'il est initialisé non ?
  • Eddy58Eddy58 Membre
    23:47 modifié #4
    Si le fichier est vide, ton array s'initialise avec un count de 0. :)
  • VeillardVeillard Membre
    23:47 modifié #5
    je suppose qu'il est initialisé non ?

    P'têt, p'têt pas  ???
  • mars 2005 modifié #6
    Je me dois de le sortir: RTFM ;)

    - (id)initWithContentsOfFile:(NSString *)aPath
    Initializes a newly allocated array with the contents of the file specified by aPath. The file identified by aPath must contain a string representation produced by the writeToFile:atomically: method. In addition, the array representation must contain only property list objects (NSString, NSData, NSArray, or NSDictionary objects).

    Returns an initialized object, which might be different than the original receiver, if initialization was successful, or nil if the file can?t be opened or the contents of the file can?t be parsed into an array.


    PS: je tiens à  signaler que pour les RTFM, je dis ça pour te taquiner, sinon je ne donnerais la réponse.
  • muqaddarmuqaddar Administrateur
    23:47 modifié #7
    Y'a écrit que ça renvoie nil si le fichier ne peut être lu, or c'est mon cas, mais si je teste si le tableau est nil, ça ne marche pas pourtant.
  • 23:47 modifié #8
    Vérifie ton code alors ;)

    Un petit tuyau, plutôt que de comparer à  nil, tu fais [tt]if (array) //code si le tableau est OK[/tt], c'est plus léger comme écriture.
  • muqaddarmuqaddar Administrateur
    23:47 modifié #9
    Tu vois, tu me sors la doc alors que dans le premier message j'avais déjà  essayé (nil == array)... ;)
  • mars 2005 modifié #10
    Ben oui, si je te sors la doc, c'est parce que dans ton premier message tu dis ça justement. Si dans la doc ça renvoie nil, et tu dis "ça marche pas si je fais (array == nil)" alors c'est que tu dois revoir ton code.

    À la limite, on pourrait imaginer qu'il y ait une erreur qui s'est glissée pour des fonctions hyper-spécialisées, mais pas pour ce genre de méthodes là .
  • muqaddarmuqaddar Administrateur
    23:47 modifié #11
    Voilà  comment je procède :

    <br />if ([[NSFileManager defaultManager] fileExistsAtPath: filePath] == YES) {		<br />     saveMailsArray = [[NSMutableArray alloc] initWithContentsOfFile:filePath];<br />     NSLog(@&quot;saveMailsArray : %@&quot;, saveMailsArray); //renvoie (null)<br />	<br />     if (saveMailsArray) {<br />          NSLog (@&quot;toto&quot;);<br />     }
    


    Et toto ne s'affiche pas. filePath a été créé comme cela :

    if (([[NSFileManager defaultManager] fileExistsAtPath: filePath] == NO)) {<br />			[[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];<br />		}
    


    Le fichier vierge est bien créé sur le HD.
  • ClicCoolClicCool Membre
    23:47 modifié #12
    dans 1111654823:

    Voilà  comment je procède :

    <br />if ([[NSFileManager defaultManager] fileExistsAtPath: filePath] == YES) {		<br />&nbsp; &nbsp;  saveMailsArray = [[NSMutableArray alloc] initWithContentsOfFile:filePath];<br />&nbsp; &nbsp;  NSLog(@&quot;saveMailsArray : %@&quot;, saveMailsArray); //renvoie (null)<br />	<br />&nbsp; &nbsp;  if (saveMailsArray) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NSLog (@&quot;toto&quot;);<br />&nbsp; &nbsp;  }
    


    Et toto ne s'affiche pas. filePath a été créé comme cela :


    donc saveMailsArray est bien nil

    ce qui est logique puisque ton fichier a beau exister, il est vide et que initWithContentsOfFile renvoie
    nil if the file can?t be opened or the contents of the file can?t be parsed into an array.
  • muqaddarmuqaddar Administrateur
    23:47 modifié #13
    Oui, c'est bon ça marche avec
    if (!saveMailsArray) {

    :)
  • mars 2005 modifié #14
    dans 1111624364:

    Un petit tuyau, plutôt que de comparer à  nil, tu fais [tt]if (array) //code si le tableau est OK[/tt], c'est plus léger comme écriture.


    Excuse moi d'insister sur les problèmes de lecture, mais je trouve que là  il y a un problème que tu dois vraiment résoudre. Surtout sur une réponse qui fait 2 phrases, qu'on ne peut même pas dire que tu n'as pas lu parce noyée dans la masse, vu tu y as répondu.

    Sinon petit truc, tu n'es pas obligé de tester l'existence du fichier, puisque [tt]-initWithContentOFile:[/tt] le fait pour toi.

    nil if the file can?t be opened or the contents of the file can?t be parsed into an array.
  • muqaddarmuqaddar Administrateur
    23:47 modifié #15
    dans 1111660413:

    dans 1111624364:

    Un petit tuyau, plutôt que de comparer à  nil, tu fais [tt]if (array) //code si le tableau est OK[/tt], c'est plus léger comme écriture.


    Excuse moi d'insister sur les problèmes de lecture, mais je trouve que là  il y a un problème que tu dois vraiment résoudre. Surtout sur une réponse qui fait 2 phrases, qu'on ne peut même pas dire que tu n'as pas lu parce noyée dans la masse, vu tu y as répondu.



    Excuse moi, mais je ne comprends rien à  ce que tu me dis ou reproches là . J'ai testé avec if (array) comme tu l'avais dit plus haut, de suite, et j'ai donné le code, voir 4 messages plus haut, alors quelle est encore cette histoire de lecture que tu sors là  ?
  • mars 2005 modifié #16
    Tu t'étonnes que toto ne s'affiche pas*, alors que j'ai bien clairement écrit "code si le tableau est OK", et que j'ai mis en gras dans la doc que nil est renvoyé si le fichier ne peut être parsé. Donc personnellement, je trouve qu'il y a là  un grave problème de lecture (que ce soit là  ou ailleurs), puisqu'en plus on t'a prémaché le boulot.

    *ou bien indique clairement dans ton post 'youpi ça marche', mais de toute façon la réponse que tu donnais à  ClicCool laisse largement penser que tu ne comprenais pas pourquoi toto ne s'affichait pas.
  • muqaddarmuqaddar Administrateur
    23:47 modifié #17
    Renaud,

    1) Dans le premier message, je parle moi même de if (array == nil), je m'étonne que ça ne marche pas, vu la doc.

    2) Tu me reproches ensuite de ne pas avoir lu la doc sur ce coup, et me la sors ou on parle de nil, et tu dis : "je ne veux pas te donner la réponse", comme si elle était cachée, alors qu'il t'aurait suffit en 1 phrase de me dire : "vu la doc, tu as bon, if (array == nil) doit marcher, donc vérifie la suite de ton code". Mais tu préfères jouer avec moi...

    3) Tu me proposes en code if (array) qui teste ta présence du tableau initialisé.

    4) Je confirme avec mon code et if (array). Effectivement, j'ai omis le "!" , faute d'inatention.
    Ce code, je le connais par coeur, c'est une simple erreur de frappe.

    5) Je confirme ensuite dans la joie et bonne humeur que ça marche avec le "!" en plus...

    6) La discussion est close mais tu reviens à  la charge, sur la lecture. Je veux bien que tu me dises que j'ai du mal à  comprendre la doc Apple en Anglais et son organisation comme beaucoup ici, mais de là  à  tirer des conclusions sur ma façon de lire, comme tu le fais à  chaque message maintenant, c'est un peu désagréable.

    7) Pour info, je me tapais la doc de php en anglais sans problème pendant 2 ans... et ça m'a jamais posé problème.

    8) Et puis, si on peut plus poser de questions, cons ou pas, sur ce forum, y'a qu'à  le supprimer.

    9) Souvent, c'est en posant les questions qu'on trouve les réponses.

    10) A part ça, il fait beau ici. Et c'est une magnifique journée de printemps où les oiseaux nous offrent une belle symphonie de sons en tous genres, dans le terroir catalan.
  • mpergandmpergand Membre
    23:47 modifié #18
    Le problème est classique et il faut faire les 2 tests:
    <br />if(saveMailsArray!=nil)<br />&nbsp; {<br />&nbsp; if([saveMailsArray count]&gt;0)<br />&nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; // c&#39;est bon<br />&nbsp; &nbsp; }<br />&nbsp; }
    
  • mars 2005 modifié #19
    1.2. Je réponds avec la doc, sous entendu que si tu t'étonnes que ça ne marche pas, tu dois chercher dans ton code.

    4.5. Dans ce cas, je présente mes excuses, mais je n'aurais pas pu le deviner. Je n'aurais pas réagi si tu avais édité ton code en indiquant par exemple que tu avais une faute de frappe (pour que ça colle avec la réflexion de ClicCool, s'il avait répondu avant que tu aies remarqué la faute), parce que quand tu dis que ça marche après le commentaire de ClicCool on peut facilement imaginer que tu as compris grâce à  son intervention.

    6.8. ça fait presque 10 mois que tu as commencé Cocoa, il y a des fautes que tu ne dois plus faire. Ne pas remarquer qu'un argument doit être d'une classe donnée, ou s'étonner qu'un objet ne réponde pas à  un sélecteur donné est pour moi une faute de lecture ou d'inattention et donc oui, je mets en cause la manière dont tu lis la doc. Donc je réagis avec un RTFM (je ne le ferais pas avec un type qui vient de commencer). Pour moi te donner la réponse clairement dans ce genre de cas n'est pas rendre service (je le fais volontiers quand la réponse est tordue, comme pour les dates par exemple, vu que même pour des gens expérimentés la réponse n'est pas évidente).

    10. ici aussi.

    11. J'aimerais que tu vires les posts qui ne concernent pas la question, nos batailles de chiffoniers ne sont pas pertinentes pour la réponse à  la question.
  • cbrandtcbrandt Membre
    23:47 modifié #20
    dans 1111663685:

    Le problème est classique et il faut faire les 2 tests:
    <br />if(saveMailsArray!=nil)<br />  {<br />  if([saveMailsArray count]&gt;0)<br />    {<br />        // c&#39;est bon<br />    }<br />  }
    



    uh ? j'ai lu que si on envoie un message à  une objet nil, le résultat est 0 (tel que implémenté par le 'runtime' objective-c)... donc si on fait
    <br />  if([saveMailsArray count]&gt;0)<br />    {<br />        // c&#39;est bon<br />    }<br />
    

    ça doit être suffisant: si saveMailsArray est nil, [saveMailsArray count] renvoie 0, et comme 0 > 0 est faux, le code à  l'endroit "// c'est bon" n'est pas exécuté, ce qui est le but recherché...
  • mpergandmpergand Membre
    23:47 modifié #21
    <br />if([saveMailsArray count]&gt;0)<br />    {<br />        // c&#39;est bon<br />    }<br />
    



    Ok au concours du code le plus court, t'es le plus fort de l'ouest 

    Seulement c'est un cas particulier, on peut avoir besoin de faire ça:

    <br />if(saveMailsArray!=nil)<br />  {<br />  if([saveMailsArray count]&gt;0)<br />    {<br />        // c&#39;est bon<br />    }<br />  else<br />     // faire autre chose<br />  }<br />else<br />    // faire encore autre chose
    



    Mais surtout, oxitan  n'est pas un expert en programmation et mon code veut simplement montrer la logique à  avoir dans ce cas.
  • cbrandtcbrandt Membre
    23:47 modifié #22
    d'accord avec toi... sauf sur le 1er point:

    dans 1111666968:

    Ok au concours du code le plus court, t'es le plus fort de l'ouest 
  • muqaddarmuqaddar Administrateur
    mars 2005 modifié #23
    Le problème de l'array nil est plus compliqué que cela, du moins pour moi. :)
    Bien évidemment, j'ai été obligé de reinitialiser l'array dans le if pour pouvoir le remplir ensuite. :)

    Pour info, la solution de cbrandt ne marche pas dans mon cas... if([saveMailsArray count]>0) ;-)
    Je veux en effet tester que le tableau n'est pas initialisé.

    Donc pour récapituler :
    Soit :
    if(saveMailsArray==nil)
    Soit :
    if(!saveMailsArray)

    Merci à  vous tous. ;)

    PS1 : je suis loin d'avoir 10 mois de Cocoa... Je n'ai jamais été une tronche en maths ou autre, ou en logique. Si je dois y passer plus de temps qu'un autre qui a plus de facilités pour obtenir la même chose, je le ferai. C'est tout.

    PS2 : je préfère poster des questions bêtes et l'être moins après. En plus ça anime un peu le site. ;)

    PS3 : je n'efface jamais les messages, ce qui est dit est dit. (exception des messages sur le piratage ou autre bien sûr...)
  • mpergandmpergand Membre
    23:47 modifié #24
    Pour info, la solution de cbrandt ne marche pas dans mon cas... if([saveMailsArray count]>0) ;-)


    Si ça doit marcher aussi:

    <br />if([saveMailsArray count]&gt;0)<br />    {<br />        // c&#39;est bon<br />    }<br />else<br />  {<br />   if(saveMailsArray==nil)<br />   &nbsp;  // initialser le tableau<br />  }<br /><br />
    


    C'est juste moins simple à  piger, je trouve...
  • muqaddarmuqaddar Administrateur
    23:47 modifié #25
    Oui, dans ce cas c'est bon... mais mon test principal était de savoir si le array était nil. ;)
Connectez-vous ou Inscrivez-vous pour répondre.