Warnings BOOL Xcode 6.3.1

samirsamir Membre
avril 2015 modifié dans API UIKit #1

Hello,


 


J'ai mis à  jour mon Xcode ce matin :).


 


J'ai remarqué que le compilateur ne me signale plus un warnings pour ce genre de code :



NSDictionary *dic = @{@key : @false};
BOOL value = dic[@key];

Le problème que j'ai pas de warnings pour cette ligne alors que il me semble que y avait un warnings pour les ancienne versions de Xcode.


 


 


Est-ce un bug Xcode/Compilateur ou j'ai raté un truc ?

Réponses

  • CéroceCéroce Membre, Modérateur
    Bizarre, effectivement; c'est une conversion explicite qui amène un bug. Il devrait y avoir un warning.
  • samirsamir Membre
    avril 2015 modifié #3

    Merci.


     


    Oui c'est bien un bug parce que c'est que sur des BOOL.   


     


     


    Warning signalé



    NSDictionary *dic = @{@key : @false};
    NSInteger value = dic[@key];

  • Pour le Warning je ne sais pas.


    Mais ça me paraà®t dangereux ce code : value prend la valeur YES dans ce cas, puisque le dictionnaire contient une entrée @key, bien que la valeur de cette entrée soit @false.


  • Et à  la réflexion je ne pense pas que ce soit un bug ; on utilise abondamment la conversion référence d'objet vers BOOL dans les if par exemple.


  • DrakenDraken Membre
    avril 2015 modifié #6

    Pour ma part, j'ai constaté que le nouveau Xcode était bien plus agressif sur les warnings/erreurs, du moins pour Swift.


     


    Avant, l'addition d'un UInt32 et d'un Int ne lui posais aucun problème de conscience. Maintenant c'est considéré comme une erreur et ça empêche carrément la compilation.



    let a:UInt32 = 12
    let b:Int = 65
    let c = a + b // <= Ambiguous use of operator '+'


    Il faut procéder à  une petite modification pour le rendre heureux.



    let a:UInt32 = 12
    let b:Int = 65
    let c = a + UInt32(b)

  • CéroceCéroce Membre, Modérateur
    avril 2015 modifié #7

    Pour ma part, j'ai constaté que le nouveau Xcode était bien plus agressif sur les warnings/erreurs, du moins pour Swift.

    C'est également vrai pour ObjC, et le fait que l'exemple donné par Samir ne lève pas de warning est d'autant plus étonnant.


  • C'est également vrai pour ObjC, et le fait que l'exemple donné par Samir ne lève pas de warning est d'autant plus étonnant.




     


    Pour moi ce n'est pas totalement illogique :


    nil = NO


    pas nil = YES

  • CéroceCéroce Membre, Modérateur
    Ce n'est pas illogique, mais c'est une source potentielle de bug.
    Effectivement, on écrit souvent:
    if(objet)
    Plutôt que
    if(objet != nil)
    Mais dans le cas d'une affectation, il serait prudent que la conversion doive être explicite:

    BOOL present = dic[@key] != nil;
  • AliGatorAliGator Membre, Modérateur
    Ouvre un radar sur BugReport, avec un exemple minimaliste de code (cas Bool sans warning + cas Int avec warning). Ils sont plutôt réactifs en ce moment.
  • Joanna CarterJoanna Carter Membre, Modérateur



    NSDictionary *dic = @{@key : @false};
    BOOL value = dic[@key];



     


     


    Pardonnes-moi, mais tu mets un NSString comme valeur pour le clé et tu récupères la valeur pour déterminer si il y a n'importe quelle valeur ? Même si tu mettais la valeur comme @NO, ça renvoie toujours YES.


     


    Je manque qqch ?

  • AliGatorAliGator Membre, Modérateur
    @Joanna justement il sait que ce code n'est pas logique et c'est pour ça qu'il s'attend donc à  avoir un warning de Xcode pour lui alerter de l'incohérence... ce qu'apparemment Xcode 6.2 faisait mais 6.3 ne fait plus, d'où le risque d'écrire par erreur du code illogique comme ça sans être averti ce qui est inquiétant.
  • C'est un bug iOS 8 puisque j'ai bien le warning sur iOS 7, j'ai soumis un bug report. 


Connectez-vous ou Inscrivez-vous pour répondre.