Ric*_*mas 1 c objective-c format-specifiers
我正在处理的应用程序有一个信用响应对象,其中包含布尔"已批准"字段.我试图在Objective C中注销这个值,但由于没有布尔值的格式说明符,我不得不求助于以下内容:
NSLog("%s", [response approved] ? @"TRUE" : @"FALSE");
Run Code Online (Sandbox Code Playgroud)
虽然不可能,但我更愿意做以下事情:
NSLog("%b", [response approved]);
Run Code Online (Sandbox Code Playgroud)
...其中"%b"是布尔值的格式说明符.
在做了一些研究之后,似乎一致的共识是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"这样的关键词更难.
纯C(回到K&R品种)实际上没有布尔类型,这是本机printf和堂兄没有本机布尔格式说明符的根本原因.表达式可以计算为零或非零整数值,这if在C语句中分别被解释为false或true.(理解这是理解令人愉快的!!"bang bang运算符"语法的语义的关键.)
(C99确实添加了一个_Bool类型,但除非你使用的是最纯粹的C,否则你不太可能需要它;派生语言和通用平台已经有了常见的布尔类型或typedef.)
该BOOL类型是一个ObjC构造,并且-[NSString stringWithFormat:](和NSLog)根本没有额外的格式说明符,它可以对它做任何特殊处理.它当然可以(除此之外%@),并选择一些合理的字符串放在那里; 我不知道是否曾经考虑过这样的事情,但无论如何它都与我所有其他格式说明符不同.你怎么知道适当地本地化或大写字母表示"是"或"否"(或"真"或"假"?)等?没有其他格式说明符导致库做出这样的决定; 所有其他都是精确数字或插入另一个方法调用的字符串结果.这看起来很麻烦,但让你选择你真正想要的文字可能是最优雅的解决方案.
| 归档时间: |
|
| 查看次数: |
152 次 |
| 最近记录: |