Ciąg formatujący Objective-C dla wartości logicznej?

Odpowiedzi:

173

Jednym ze sposobów jest konwersja na łańcuchy (ponieważ są tylko dwie możliwości, nie jest to trudne):

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

Nie sądzę, że istnieje specyfikator formatu dla wartości logicznych.

Michael Myers
źródło
2
Czy łańcuchami wyjściowymi nie powinny być: „Tak” i „Nie”: P
Ben S
131
Lub „Ciasto” i „Bez ciasta”. Cokolwiek ci pasuje.
Michael Myers
2
Uwielbiam ciasto i żadnego ciasta! Zamieniam cały mój kod x? @ "YES": @ "NO" na x? @ "Cake": @ "No Cake" natychmiast: D - cóż, przynajmniej dla opisów moich obiektów;)
Jason Coco
8
Lub TheCakeIsALie i TheCakeIsNotALie.
Warren P
3
% hhd to właściwy sposób wyświetlania wartości logicznej jako flagi całkowitej jako 0 lub 1. 0 oznacza fałsz 1 oznacza prawdę.
Onder OZCAN
69

Chciałbym polecić

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

ponieważ, um, BOOLs są nazywane YESlub NOw Objective-C.

Yuji
źródło
2
Wydaje się oczywistym miejscem użyteczności dla makra lub funkcji (choćby po to, aby uniknąć propagacji literałów ciągów w całej aplikacji).
Warren P
Tylko ty naprawdę nie musisz unikać "propagacji" takich łańcuchów - tak jak ObjC łączy w sobie instancje niezmiennych łańcuchów (i innych obiektów) o takiej samej wartości - tak, że tylko jedna kopia znajduje się w pamięci. Makro jest w porządku, funkcja jest w porządku, a kopiowanie i wklejanie również jest OK.
Motti Shneor
52

Użyj programu formatującego liczby całkowite %d, który wypisze albo 0albo 1:

NSLog(@"%d", myBool);
Erin Geyer
źródło
23

W Objective-C BOOLtyp jest po prostu znakiem ze znakiem. Od <objc/objc.h>:

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

Możesz więc wydrukować je za pomocą programu %dformatującego Ale to spowoduje wydrukowanie tylko a 1lub a 0, nie YESlub NO.

Możesz też po prostu użyć ciągu znaków, jak sugerowano w innych odpowiedziach.

mipadi
źródło
1
Czy% c nie spróbuje wydrukować znaku ASCII 0 lub 1, z których oba są znakami sterującymi?
JeremyP
21

Dodaj tę wbudowaną funkcję do swojego .hpliku:

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

Teraz jesteś gotowy do pracy ...

NSLog(@"%@", NSStringFromBOOL(BOOL_VAL));
gigahari
źródło
1

Po prostu dodaj poniższą funkcję i przekaż jej BOOLwartość, a metoda zwróciNSString

- (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
źródło
1

Uważam, że najłatwiej to zrobić:

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

@(wyrażenie)

Dynamicznie ocenia wyrażenie w ramce i zwraca odpowiedni literał obiektu na podstawie jego wartości (np. NSString dla const char *, NSNumber dla int, itp.).

asamoylenko
źródło
0

Stworzyłem w ten sposób kategorię NSString

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

I użyj tego w ten sposób:

[NSString stringWithBool:boolValue];
xlsmearlx
źródło