【问题标题】:Is there a format specifier that works with Boolean values?是否有适用于布尔值的格式说明符?
【发布时间】:2011-10-08 18:53:46
【问题描述】:

我想做这样的事情:

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

其中 x 是说明符。但是我一个也找不到!我想避免:

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

有什么想法吗?文档没有布尔说明符。 %@ 也不起作用。

【问题讨论】:

  • 有趣的是 %x 会起作用。 (小写十六进制说明符)
  • %@ 是 Objective-C 对象指针的格式说明符。 BOOL、Boolean、bool 等不是对象类型。

标签: iphone ios string format-specifiers


【解决方案1】:

os_log使用

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

如果您使用的是最新的操作系统,您还可以使用字符串插值。 更多信息请查看Format Custom Values in Message Strings

正如@MottiShneor 指出的,os_log(3) 手册页中有更详细的列表:

Value type      Custom specifier         Example output
-----------------------------------------------------------------------------
BOOL            %{BOOL}d                 YES
bool            %{bool}d                 true
darwin.errno    %{darwin.errno}d         [32: Broken pipe]
darwin.mode     %{darwin.mode}d          drwxr-xr-x
darwin.signal   %{darwin.signal}d        [sigsegv: Segmentation Fault]
time_t          %{time_t}d               2016-01-12 19:41:37
timeval         %{timeval}.*P            2016-01-12 19:41:37.774236
timespec        %{timespec}.*P           2016-01-12 19:41:37.2382382823
bitrate         %{bitrate}d              123 kbps
iec-bitrate     %{iec-bitrate}d          118 Kibps
uuid_t          %{uuid_t}.16P            10742E39-0657-41F8-AB99-878C5EC2DCAA
sockaddr        %{network:sockaddr}.*P   fe80::f:86ff:fee9:5c16
in_addr         %{network:in_addr}d      127.0.0.1
in6_addr        %{network:in6_addr}.16P  fe80::f:86ff:fee9:5c16

【讨论】:

  • 这很有启发性 - 我一直在寻找这个很长时间 - 但是你在哪里找到文档,链接只提供 Swift 替代方案,Objective-C 中可能的值类型列表在哪里???请帮忙。
  • 这里是文档:他们提供 Swift 和 Obj-C 之间的选择,但 Apple(故意?)在 ObjC 方面没有留下任何东西 --- 都是 Swift。 * developer.apple.com/documentation/os/…
  • 你仍然需要告诉我你在哪里找到了 {bool} 和 {BOOL} 说明符,因为它们在 NOWHERE 中出现,还有很多其他的我不知道如何正式化。
  • 最后我找到了文档...它仅在“man os_log”中可用,其他任何地方都没有。
  • 为什么你问的不是“官方文档”?你知道 MacOS 内核被命名为“XNU”,对吧?代表“X 不是 Unix”。 MacOS 有其 API 信息的约定和来源。无论是在网络上、在 Xcode 中、在 SDK 标头中还是在其他地方。维护“手册页”以保持与 BSD 和 POSIX 爱好者的兼容性——它们绝不是 MacOS 的任何标准。当然,那里也有信息很好——但苹果也有责任在他们的“官方”文档中提供这些信息。
【解决方案2】:

当然你可以使用直接的布尔格式化说明符 %x

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

但至少,您始终可以依赖 NSNumber 对象,它们“记住”它们“框”的数据的“类型”,因此该 NSLog 也可以正常工作:

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

注意使用 NSNumber 文字 - 而不是字符串。

【讨论】:

    【解决方案3】:

    Swift 上,使用String(describing: booleanValue)

    例如:os_log("You got %@", log: .default, type: .debug, String(describing: booleanValue))

    【讨论】:

    • 这将在控制台中打印:You got trueYou got false。 os_log 是统一的日志记录方法,你可以在这里阅读:developer.apple.com/documentation/os/logging
    • 在某些情况下您可以同时使用%s%@,但%@ 更好
    • %s 用于原始 c 字符串,%@ 用于 Objective-C 对象,并依次调用对象上的 [x description] 方法以提供其字符串解释。它不是“更好”,而是适用于其他事情。但是,您不需要使用原始布尔值,因为 os_log 有其特定的布尔描述符: os_log("You got %{bool}d", booleanValue)
    【解决方案4】:

    是的

    代码如下:

    NSLog(@"%hhd",BOOLvariable);
    

    打印 1 表示是,打印 0 表示否。为我工作。

    【讨论】:

    • 从 iOS10 开始抛出警告(可能更早)%i,然而,即使没有显式 (int) 强制转换,也不再抛出警告。
    【解决方案5】:

    这里有两件事有效:

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

    或者你可以投射:

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

    哪个会输出 0 或 1

    【讨论】:

    • 谢谢,我忘了? : 切换!
    • 你不需要演员表。 NSLog() 是可变参数,signed charBOOL 是)将隐式提升为 int
    【解决方案6】:

    据我所知,没有格式说明符。你可以这样做:

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

    或者,您可以使用上面的逻辑编写一个小函数或宏,它接受一个 BOOL 并返回适当的字符串。然后,您可以在日志语句中使用该函数。

    【讨论】:

      【解决方案7】:

      您可以将其转换为 int 并使用 %d:

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

      或者使用这样的东西:

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

      【讨论】:

      • 演员表不是必须的,看我对PengOne的回答的评论。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 2018-03-13
      相关资源
      最近更新 更多