Приложение, над которым я работаю, имеет объект ответного ответа с логическим «одобренным» полем. Я пытаюсь выйти из этого значения в Objective C, но так как нет спецификатора формата для Booleans, я должен прибегнуть к следующему:Почему ни C, ни Objective-C не имеют спецификатора формата для булевых значений?
NSLog("%s", [response approved] ? @"TRUE" : @"FALSE");
Хотя это не возможно, я бы предпочел, чтобы сделать что-то вроде следующие:
NSLog("%b", [response approved]);
... где «% b» - спецификатор формата для логического значения.
После некоторого исследования кажется единодушным consensus в том, что ни C, ни Objective-C не имеют эквивалента спецификатора «% b», и большинство разработчиков заканчивают свой собственный (что-то вроде опции № 1 выше).
Очевидно, что Dennis Ritchie & Co. знал, что они делают, когда они написали C, и я сомневаюсь, что этот недостающий спецификатор формата был случайным. Мне любопытно узнать обоснование этого решения, поэтому я могу объяснить это своей команде (кому тоже интересно).
EDIT: Некоторые ответы ниже предполагают, что это может быть проблемой локализации, то есть «TRUE» и «FALSE» слишком английский конкретного. Но разве это не было бы дилеммой, с которой сталкиваются все языки? то есть не только C и Objective-C? Java и Ruby, среди прочего, способны реализовать логические значения «True» и «False». Не знаю, почему авторы этих язычников не выбрали подобный выбор.
Кроме того, если локализация была проблемой, я ожидал бы, что это повлияет и на другие аспекты языка. Например, возьмите защищенные ключевые слова. C использует английские ключевые слова, такие как «include», «define», «return», «void» и т. Д., И эти ключевые слова, возможно, более сложны для неанглийских ораторов, чем ключевые слова, такие как «true» или «false».
Ваш первый фрагмент кода использует '% s' с строковыми литералами Objective-C (' @ "" '). Либо используйте '% @', либо используйте строковые литералы C. Кроме того, вы можете обернуть выбор строки для логического в встроенной функции: 'static inline NSString * bool_name (BOOL val) {return val? @ "TRUE": @ "FALSE"; } ', а затем' NSLog (@ "% @", bool_name ([одобрено ответом]); '. –