Есть ли спецификатор формата, который работает с логическими значениями?

Я хочу сделать что-то вроде этого:

NSLog(@"You got: %x", booleanValue);

где x — спецификатор. Но я не могу найти! Я хочу избежать:

if (booleanValue) {
    NSLog(@"You got: YES");
}
else {
    NSLog(@"You got: NO");
}

Любые идеи? В документах не было логического спецификатора. %@ тоже не сработало.


person Jay Imerman    schedule 19.07.2011    source источник
comment
Что забавно, %x сработает. (шестнадцатеричный спецификатор нижнего регистра)   -  person Joe    schedule 19.07.2011
comment
%@ — это спецификатор формата для указателя объекта Objective-C. BOOL, Boolean, bool и т. д. не являются объектными типами.   -  person Caleb    schedule 20.07.2011


Ответы (7)


Вот две вещи, которые работают:

NSLog(@"You got: %@",booleanValue ? @"YES" : @"NO");

или вы можете разыграть:

NSLog(@"You got: %d", (int)booleanValue);

Который выведет 0 или 1

person PengOne    schedule 19.07.2011
comment
Спасибо, я забыл про ? : выключатель! - person Jay Imerman; 20.07.2011
comment
Вам не нужен актерский состав. NSLog() является вариативным, signed char (то есть BOOL) будет неявно повышен до int. - person ; 17.04.2013

Вы можете привести его к типу int и использовать %d:

NSLog(@"You got: %d", (int)booleanValue);

Или используйте что-то вроде этого:

NSLog(@"You got: %@", booleanValue ? @"YES" : @"NO");
person Todd Yandell    schedule 19.07.2011
comment
В ролях нет необходимости, см. мой комментарий к ответу PengOne. - person ; 17.04.2013

Я не знаю спецификатора формата. Ты можешь сделать это:

NSLog(@"You got: %@", (booleanValue ? @"YES" : @"NO"));

В качестве альтернативы вы можете написать небольшую функцию или макрос, используя приведенную выше логику, которая принимает BOOL и возвращает соответствующую строку. Затем вы можете использовать эту функцию в своих операторах журнала.

person Caleb    schedule 19.07.2011

Для os_log использования

os_log("results in true/false: %{bool}d", myBool)
os_log("results in YES/NO: %{BOOL}d", myBool)

Если вы используете последнюю версию ОС, вы также можете использовать интерполяцию строк. Дополнительные сведения см. в разделе Формат пользовательских значений в строках сообщений.

person Erik Aigner    schedule 14.01.2021
comment
Это освещает - и я очень долго это искал - но ГДЕ вы нашли документацию, ссылка дает только альтернативы Swift, где список возможных типов значений в Objective-C ??? Пожалуйста помоги. - person Motti Shneor; 06.04.2021
comment
Какая альтернатива Swift? os_log API — это C API, а идентификаторы строкового формата одинаковы для C/ObjC и Swift. - person Erik Aigner; 07.04.2021
comment
Вот документы: они предлагают выбор между Swift и Obj-C, но Apple (намеренно?) ничего не оставила на стороне ObjC --- это все Swift. * developer.apple.com/documentation/os/ - person Motti Shneor; 08.04.2021
comment
Вам все еще нужно сказать мне, где вы нашли спецификаторы {bool} и {BOOL}, так как они появляются НИГДЕ, и есть много других, которые я не знаю, как формализовать. - person Motti Shneor; 08.04.2021

В Swift используйте String(describing: booleanValue)

Например: os_log("You got %@", log: .default, type: .debug, String(describing: booleanValue))

person gutte    schedule 09.01.2020
comment
Это напечатает: You got true или You got false в консоли. os_log — это унифицированный метод ведения журнала, вы можете прочитать об этом здесь: developer.apple.com/documentation/os /регистрация - person gutte; 19.01.2020
comment
вы можете использовать как %s, так и %@ в некоторых случаях, но %@ лучше - person gutte; 21.01.2020

Да

Вот код:

NSLog(@"%hhd",BOOLvariable);

Печатает 1 для Да и 0 для Нет. Сработало для меня.

person ViruMax    schedule 31.01.2014
comment
Выдает предупреждение с iOS10 (возможно, раньше) %i, однако больше не выдает предупреждение даже без явного (int) приведения. - person Albert Renshaw; 02.05.2017

Конечно, вы можете использовать спецификатор прямого логического форматирования %x.

BOOL flag = YES;
NSLog(@"You got: %x", flag);

но, по крайней мере, вы всегда можете полагаться на объекты NSNumber, которые «помнят» «тип» данных, которые они «упаковывают», поэтому этот NSLog также будет работать нормально:

NSLog(@"You got %@", flag? @YES : @NO);

Обратите внимание на использование литералов NSNumber, а не строк.

person Motti Shneor    schedule 06.04.2021