【发布时间】:2015-04-07 23:00:13
【问题描述】:
我正在开发的应用程序有一个带有布尔“已批准”字段的信用响应对象。我试图在 Objective C 中注销这个值,但由于没有布尔值的格式说明符,我不得不求助于以下内容:
NSLog("%s", [response approved] ? @"TRUE" : @"FALSE");
虽然不可能,但我更愿意执行以下操作:
NSLog("%b", [response approved]);
...其中“%b”是布尔值的格式说明符。
在做了一些研究之后,似乎一致的 consensus 是 C 和 Objective-C 都没有相当于“%b”的说明符,大多数开发人员最终都自己动手(类似于上面的选项 #1) .
显然 Dennis Ritchie & Co. 在编写 C 时就知道他们在做什么,我怀疑这个丢失的格式说明符是个意外。我很想知道这个决定背后的理由,所以我可以向我的团队(他们也很好奇)解释一下。
编辑: 下面的一些答案表明这可能是一个本地化问题,即“TRUE”和“FALSE”过于特定于英语。但这不是所有语言都面临的困境吗?即不仅仅是C和Objective-C? Java 和 Ruby 等能够实现“True”和“False”布尔值。不知道为什么这些 langs 的作者没有类似地选择这个选项。
此外,如果本地化是问题所在,我预计它也会影响语言的其他方面。以受保护的关键字为例。 C 使用诸如“include”、“define”、“return”、“void”等英文关键字,这些关键字对于非英语使用者来说可能比“true”或“false”等关键字更难解析。
【问题讨论】:
-
您的第一个代码 sn-p 使用
%s和 Objective-C 字符串文字 (@"")。使用%@或使用 C 字符串文字。此外,您可以将布尔值的字符串选择封装在一个内联函数中:static inline NSString* bool_name(BOOL val) { return val ? @"TRUE" : @"FALSE"; },然后是NSLog(@"%@", bool_name([response approved]));。
标签: objective-c c format-specifiers