是否有一个使用布尔值的格式说明符?

Jay*_*man 17 string iphone format-specifiers ios

我想做这样的事情:

NSLog(@"You got: %x", booleanValue);
Run Code Online (Sandbox Code Playgroud)

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

if (booleanValue) {
    NSLog(@"You got: YES");
}
else {
    NSLog(@"You got: NO");
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?文档没有布尔说明符. %@也没用.

Pen*_*One 33

这有两件事有效:

NSLog(@"You got: %@",booleanValue ? @"YES" : @"NO");
Run Code Online (Sandbox Code Playgroud)

或者你可以施放:

NSLog(@"You got: %d", (int)booleanValue);
Run Code Online (Sandbox Code Playgroud)

哪个会输出0或1

  • 你不需要演员.`NSLog()`是可变参数,`signed char`(`BOOL`是)将被隐式提升为`int`. (2认同)

Tod*_*ell 7

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

NSLog(@"You got: %d", (int)booleanValue);
Run Code Online (Sandbox Code Playgroud)

或者使用这样的东西:

NSLog(@"You got: %@", booleanValue ? @"YES" : @"NO");
Run Code Online (Sandbox Code Playgroud)


Cal*_*leb 5

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

NSLog(@"You got: %@", (booleanValue ? @"YES" : @"NO"));
Run Code Online (Sandbox Code Playgroud)

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


小智 5

用来os_log

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

如果您使用的是最新的操作系统,您还可以使用字符串插值。有关详细信息,请参阅设置消息字符串中的自定义值格式

正如 @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
Run Code Online (Sandbox Code Playgroud)