Строка форматирования 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.

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


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

21

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

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

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

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


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 и т. Д.).


0

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

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

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

[NSString stringWithBool:boolValue];
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.