J'ai vu le "nouveau type" BOOL
( YES
, NO
).
J'ai lu que ce type est presque comme un caractère.
Pour les tests, j'ai fait:
NSLog(@"Size of BOOL %d", sizeof(BOOL));
NSLog(@"Size of bool %d", sizeof(bool));
C'est bien de voir que les deux journaux affichent "1" (parfois en C ++, bool est un entier et sa taille est 4)
Je me demandais donc s'il y avait des problèmes avec le type booléen ou quelque chose du genre?
Puis-je simplement utiliser bool (qui semble fonctionner) sans perdre de vitesse?
c
objective-c
types
boolean
Francescu
la source
la source
bool
. Tous les frameworks Objective-C utilisentBOOL
.NSInteger progressTime = 2;//any value NSInteger totalTime = 1;//any value BOOL success = (progressTime>=totalTime)
// il donne toujoursNO
mais une fois que j'ai reçu cette(progressTime>=totalTime)
valeur dans lebool
type,success
il renvoie le résultat correct. Je ne comprends pas ce comportement. J'utiliseXcode 7.x
et laiOS
version était8.x
. @BarryWarkComme mentionné ci-dessus, BOOL est un caractère signé. bool - type de la norme C99 (int).
BOOL - OUI / NON. booléen - vrai / faux.
Voir des exemples:
Et le résultat est
Notez que bool! = BOOL. Le résultat ci-dessous n'est encore qu'une fois - REAL b2
Si vous voulez convertir bool en BOOL, vous devez utiliser le code suivant
Donc, dans notre cas:
Et donc ... ce que nous obtenons maintenant? :-)
la source
!!b1
. Pour convertir entre euxAu moment de la rédaction de cet article, il s'agit de la version la plus récente de objc.h:
Cela signifie que sur les appareils iOS 64 bits et WatchOS,
BOOL
c'est exactement la même chosebool
que sur tous les autres appareils (OS X, iOS 32 bits), il estsigned char
et ne peut même pas être remplacé par l'indicateur du compilateur-funsigned-char
Cela signifie également que cet exemple de code fonctionnera différemment sur différentes plates-formes (je l'ai testé moi-même):
BTW choses ne Assigner aiment
array.count
àBOOL
variables car environ 0,4% des valeurs possibles sera négatif.la source
Le type Objective-C que vous devez utiliser est
BOOL
. Il n'y a rien de tel qu'un type de données booléen natif, donc pour être sûr que le code compile sur tous les compilateurs utilisentBOOL
. (Il est défini dans Apple-Frameworks.la source
BOOL
est défini par le langage Objective-C (c'est dans l'un des en-objc/*.h
têtes), pas par les frameworks. De plus, lors de la compilation avec C99 (ce que je pense être la valeur par défaut), il existe un type booléen natif_Bool
(oubool
s'ilstdbool.h
est inclus).Oui, BOOL est un typedef pour un caractère signé selon objc.h.
Je ne sais pas pour bool, cependant. C'est un truc C ++, non? S'il est défini comme un caractère signé où 1 est OUI / vrai et 0 est NON / faux, alors j'imagine que celui que vous utilisez n'a pas d'importance.
Puisque BOOL fait partie d'Objective-C, cependant, il est probablement plus logique d'utiliser un BOOL pour plus de clarté (d'autres développeurs d'Objective-C pourraient être perplexes s'ils voient un bool en cours d'utilisation).
la source
Une autre différence entre bool et BOOL est qu'ils ne se convertissent pas exactement dans le même type d'objets, lorsque vous effectuez une observation clé-valeur ou lorsque vous utilisez des méthodes telles que - [NSObject valueForKey:].
Comme tout le monde l'a dit ici, BOOL est char. En tant que tel, il est converti en NSNumber contenant un char. Cet objet est indiscernable d'un NSNumber créé à partir d'un caractère normal comme «A» ou «\ 0». Vous avez totalement perdu l'information que vous aviez à l'origine un BOOL.
Cependant, bool est converti en CFBoolean, qui se comporte de la même manière que NSNumber, mais qui conserve l'origine booléenne de l'objet.
Je ne pense pas que ce soit un argument dans un débat BOOL vs bool, mais cela peut vous mordre un jour.
De manière générale, vous devriez aller avec BOOL, car c'est le type utilisé partout dans les API Cocoa / iOS (conçu avant C99 et son type booléen natif).
la source
La réponse acceptée a été modifiée et son explication est devenue un peu incorrecte. L'échantillon de code a été actualisé, mais le texte ci-dessous reste le même. Vous ne pouvez pas supposer que BOOL est un caractère pour le moment car il dépend de l'architecture et de la plate-forme. Ainsi, si vous exécutez votre code sur une plate-forme 32 bits (par exemple iPhone 5) et imprimez @encode (BOOL), vous verrez "c". Cela correspond à un type char . Mais si vous exécutez votre code sur l'iPhone 5s (64 bits), vous verrez "B". Cela correspond à un type booléen .
la source
Je vais contre la convention ici. Je n'aime pas les typedef aux types de base. Je pense que c'est une indirection inutile qui enlève de la valeur.
la source
size_t
), et les deuxbool
(C99) etBOOL
(ObjC) entrent dans cette catégorie. Et si votre code a échoué en raison d'un changement de typedef, c'est votre code à blâmer puisque vous n'avez apparemment pas traité le typedef comme une chose opaque, mais vous vous êtes appuyé sur son implémentation sur une plate-forme. (Il n'y a pas de quoi avoir honte, ça arrive, mais ce n'est pas le typedef à blâmer.)BOOL varname
au lieu dechar varname
cela, il est plus évident que les deux valeurs valides pour cette variable sonttrue
/YES
oufalse
/NO
.Comme mentionné ci-dessus, il
BOOL
peut s'agir d'ununsigned char
type en fonction de votre architecture, alors qu'ilbool
est de typeint
. Une expérience simple montrera la différence pourquoi BOOL et bool peuvent se comporter différemment:À votre grande surprise
if(objcBOOL != YES)
, le compilateur évaluera à 1, car ilYES
s'agit en fait du code de caractère 1, et aux yeux du compilateur, le code de caractère 64 n'est bien sûr pas égal au code de caractère 1, donc l'instruction if sera évaluée àYES/true/1
et la ligne suivante sera courir. Cependant, comme unbool
type aucun zéro évalue toujours la valeur entière de 1, le problème ci-dessus n'affectera pas votre code. Voici quelques bons conseils si vous souhaitez utiliser leObjective-C BOOL
type par rapport auANSI C bool
type:YES
ouNO
valeur et rien d'autre.BOOL
types en utilisant double not!!
opérateur pour éviter des résultats inattendus.YES
utilisation,if(!myBool) instead of if(myBool != YES)
il est beaucoup plus propre d'utiliser l'!
opérateur not et donne le résultat attendu.la source
Soyez également conscient des différences de diffusion, en particulier lorsque vous travaillez avec des masques de bits, en raison de la diffusion en caractère signé:
Si BOOL est un caractère signé au lieu d'un booléen, la conversion de 0x0100 en BOOL supprime simplement le bit défini et la valeur résultante est 0.
la source