Строка форматирования Objective-C для логического?

Ответы:

173

Один из способов сделать это - преобразовать в строки (поскольку есть только две возможности, это несложно):

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

Я не думаю, что есть спецификатор формата для логических значений.

Майкл Майерс
источник
2
Разве выходные строки не должны быть: «Да» и «Нет»: P
Ben S
131
Или «Торт» и «Без торта». Все, что вам подходит.
Майкл Майерс
2
Я люблю торты, а не торты! Я собираюсь заменить весь свой код x? @ "YES": @ "NO" на x? @ "Cake": @ "No Cake" немедленно: D - ну, по крайней мере, для описания моих объектов;)
Джейсон Coco
8
Или TheCakeIsALie и TheCakeIsNotALie.
Уоррен П.
3
% hhd - это правильный способ отображения логического значения в виде целочисленного флага, равного 0 или 1. 0 - ложь, 1 - истина.
Ондер ОЗКАН
69

я бы порекомендовал

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

потому что, гм, BOOLs вызываются YESили NOв Objective-C.

Юджи
источник
2
Это кажется очевидным полезным местом для макроса или функции (хотя бы для того, чтобы избежать распространения строковых литералов по всему приложению).
Уоррен П.
Только вам действительно не нужно избегать «распространения» таких строк - как ObjC объединяет однозначные экземпляры неизменяемых строк (и других объектов) - так что только одна копия находится в памяти. Макрос в порядке, функция в порядке, копирование и вставка тоже в порядке.
Мотти Шнеор
52

Используйте целое форматировщик %d, который будет печатать либо 0или 1:

NSLog(@"%d", myBool);
Эрин Гейер
источник
23

В Objective-C BOOLтипом является просто знаковый символ. Откуда <objc/objc.h>:

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

Таким образом, вы можете распечатать их с помощью %dформаттера, но он будет печатать только a 1или a 0, а не YESили NO.

Или вы можете просто использовать строку, как это предлагается в других ответах.

mipadi
источник
1
% C не попытается ли напечатать символ ASCII 0 или 1, оба из которых являются управляющими?
JeremyP
21

Добавьте эту встроенную функцию в свой .hфайл:

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

Теперь вы готовы к работе ...

NSLog(@"%@", NSStringFromBOOL(BOOL_VAL));
gigahari
источник
1

Просто добавьте приведенную ниже функцию и передайте ей BOOLзначение, и метод вернет обратноNSString

- (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
}
Брайан Норден
источник
1

Я считаю, что самый простой способ сделать это:

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

@ (Выражение)

Динамически оценивает упакованное выражение и возвращает соответствующий литерал объекта на основе его значения (например, NSString для const char *, NSNumber для int и т. Д.).

asamoylenko
источник
0

Я создал категорию NSString с этим

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

И используйте это так:

[NSString stringWithBool:boolValue];
xlsmearlx
источник