Chaîne de formatage Objective-C pour booléen?

Réponses:

173

Une façon de le faire est de convertir en chaînes (puisqu'il n'y a que deux possibilités, ce n'est pas difficile):

NSLog(@" %s", BOOL_VAL ? "true" : "false");

Je ne pense pas qu'il existe un spécificateur de format pour les valeurs booléennes.

Michael Myers
la source
2
Les chaînes de sortie ne devraient-elles pas être: "Oui" et "Non": P
Ben S
131
Ou "Cake" et "No cake". Tout ce qui vous convient.
Michael Myers
2
J'adore le gâteau et pas le gâteau! Je vais remplacer tout mon code x? @ "OUI": @ "NON" par x? @ "Cake": @ "No Cake" immédiatement: D - enfin, au moins pour mes descriptions d'objets de toute façon;)
Jason Coco
8
Ou TheCakeIsALie et TheCakeIsNotALie.
Warren P
3
% hhd est la bonne façon d'afficher une valeur booléenne sous forme d'indicateur entier comme 0 ou 1. 0 est faux 1 est vrai.
Onder OZCAN
69

je recommanderais

NSLog(@"%@", boolValue ? @"YES" : @"NO");

parce que, um, BOOLs sont appelés YESou NOen Objective-C.

Yuji
la source
2
Cela semble être une tâche utilitaire évidente pour une macro ou une fonction (ne serait-ce que pour éviter la propagation de chaînes littérales dans toute l'application).
Warren P
Seulement, vous n'avez pas vraiment besoin d'éviter la "propagation" de telles chaînes - car ObjC coallescs des instances de même valeur de chaînes immuables (et d'autres objets) - de sorte qu'une seule copie réside en mémoire. La macro est OK, la fonction est OK et le copier-coller est également OK.
Motti Shneor
52

Utilisez le formateur d'entiers %d, qui imprimera soit 0soit 1:

NSLog(@"%d", myBool);
Erin Geyer
la source
23

En Objective-C, le BOOLtype est juste un caractère signé. De <objc/objc.h>:

typedef signed char BOOL;
#define YES         (BOOL)1
#define NO          (BOOL)0

Vous pouvez donc les imprimer à l'aide du %dformateur. Mais cela n'imprimera qu'un 1ou un 0, pas YESou NO.

Ou vous pouvez simplement utiliser une chaîne, comme suggéré dans d'autres réponses.

mipadi
la source
1
% C n'essaiera-t-il pas d'imprimer le caractère ASCII 0 ou 1 qui sont tous deux des caractères de contrôle?
JeremyP
21

Ajoutez cette fonction en ligne à votre .hfichier:

static inline NSString* NSStringFromBOOL(BOOL aBool) {
    return aBool? @"YES" : @"NO";
}

Maintenant, vous êtes prêt à partir...

NSLog(@"%@", NSStringFromBOOL(BOOL_VAL));
Gigahari
la source
1

Ajoutez simplement la fonction ci-dessous et transmettez-lui la BOOLvaleur et la méthode renverra leNSString

- (NSString *)boolValueToString:(BOOL)theBool {
    if (theBool == 0)
        return @"NO"; // can change to No, NOOOOO, etc
    else
        return @"YES"; // can change to YEAH, Yes, YESSSSS etc
}
Bryan Norden
la source
1

Je pense que le moyen le plus simple de le faire est:

NSLog(@" %@", @(BOOL_VAL));

@(expression)

Évalue dynamiquement l'expression encadrée et renvoie le littéral d'objet approprié en fonction de sa valeur (c'est-à-dire NSString pour const char *, NSNumber pour int, etc.).

asamoylenko
la source
0

J'ai créé une catégorie de NSString avec ceci

+ (instancetype)stringWithBool:(BOOL)boolValue {
return boolValue ? @"YES" : @"NO";
}

Et utilisez-le comme ceci:

[NSString stringWithBool:boolValue];
xlsmearlx
la source