【问题标题】:BOOL to NSString布尔到 NSString
【发布时间】:2010-10-18 19:41:20
【问题描述】:

如果我有一个返回BOOL 的方法,如何将其转换为NSString,以便可以在控制台中打印出来?

例如,我尝试这样做,但不起作用:

NSLog(@"Is Kind of NSString:", ([thing isKindOfClass:[NSString class]]) ? @"YES" : @"NO");

但我真的很想把返回值变成一个 NSString。我知道它是一种原始数据类型,所以我不能在它上面调用方法。我是否必须单独创建一个字符串,然后在 NSString 上的方法中使用 Bool 作为参数?

【问题讨论】:

  • 您的语句的问题在于您没有在 NSLog 的第一个参数中包含任何格式说明符。与 BOOL 无关。

标签: objective-c nsstring boolean


【解决方案1】:

使用ternary operator

BOOl isKind= [thing isKindOfClass:[NSString class]];

NSLog(@"Is Kind of NSString: %d", isKind);
NSLog(@"Is Kind of NSString: %@", isKind ? @"YES" : @"NO");

【讨论】:

  • 您在这些字符串前面缺少“@”。
【解决方案2】:

您的格式字符串中需要一个格式说明符:

NSLog(@"Is Kind of NSString: %@", ([thing isKindOfClass:[NSString class]]) ? @"YES" : @"NO");

【讨论】:

    【解决方案3】:

    在后台 BOOL 的行为类似于 int 类型,因此您可以使用 %i 在 NSLog 中测试 BOOL 类型的值:

    BOOL a = YES;
    BOOL b = NO;
    NSLog(@"a is %i and b is %i", a, b);
    
    // Output: a is 1 and b is 0
    

    【讨论】:

      【解决方案4】:

      所以,我知道这真的很老了,但我想我不妨把我的解决方案扔进戒指。我愿意:

      #define NSStringFromBOOL(aBOOL)    ((aBOOL) ? @"YES" : @"NO")
      NSLog(@"Is Kind of NSString: %@", NSStringFromBOOL([thing isKindOfClass: [NSString class]]);
      

      我觉得这更符合 Apple 的一些 to-string 宏(NSStringFromClassNSStringFromRectNSStringFromSelector 等),并且通常非常简单易用。请务必将该宏放在全局可访问或经常导入的位置!

      【讨论】:

      • 用 NS- 作为前缀不是一个好主意。那是苹果的前缀。当他们稍后添加它并且您的定义开始微妙地冲突时,这会导致相当多的挫败感。
      • 但是当您检查的对象是实际命名 NSString 时,您会怎么做?将其称为其他任何内容都不能代表它正在检查的内容。
      • 同意查克;将宏命名为BOOLToNSString() 会更好。 @chroipahtz
      • 它不是以 NS 为前缀,而是说它返回一个 NSString。是的,这可能会导致冲突,但那是因为该名称仅使用了两种 Apple 类型,而不是因为它具有前缀(这意味着删除 NS 并不能解决问题)。如果不想发生冲突,则必须将自己的前缀放入任何全局符号中,在本例中为 PCPNSStringFromBOOL
      • 额外括号表示良好的措施:#define NSStringFromBOOL(b) ((b) ? @"YES" : @"NO")
      【解决方案5】:

      你像这样打印一个 BOOL:

      NSLog(@"The BOOL value is %s", theBoolValue ? "YES" : "NO");
      

      或者,使用新的@ 表示法,可以这样做:

      NSLog(@"The BOOL value is %@", @(theBoolValue));
      

      【讨论】:

        【解决方案6】:

        NSLog 使用简单的 printf 样式调用格式化其文本,而您的代码示例缺少嵌入对象所需的字符序列。

        这应该可行:

        NSLog(@"Is Kind of NSString: %@", ([thing isKindOfClass:[NSString class]]) ? @"YES" : @"NO");
        

        【讨论】:

          【解决方案7】:

          首先你应该添加一个格式说明符%@。 它应该是这样的:

          NSLog(@"Is Kind of NSString: %@", ([thing isKindOfClass:[NSString class]]) ? @"YES" : @"NO");
          

          您还可以使用外部函数提取从BOOLNSString 的转换,就像Apple 对NSStringFromCGRectNSStringFromClass 等所做的那样。

          创建 utils 文件或将以下代码添加到现有文件的标题中:

          //NSString+TypeConversion.h
          
          extern NSString *NSStringFromBOOL(BOOL aBool);
          

          并且还将以下代码添加到实现中:

          //NSString+TypeConversion.m
          
          NSString *NSStringFromBOOL(BOOL aBool)
          {
              return aBool ? @"YES" : @"NO";
          }
          

          所以现在你可以在其他地方使用这个功能,你的代码变得更加清晰和可重用:

          #import "NSString+TypesConversion.h"
          
          NSLog(@"Is Kind of NSString: %@", NSStringFromBOOL([thing isKindOfClass:[NSString class]]));
          

          【讨论】:

            【解决方案8】:

            这对我有用:

            NSLog(@"The BOOL value is %@", theBoolValue ? "YES" : "NO");
            

            【讨论】:

              猜你喜欢
              • 2012-05-10
              • 1970-01-01
              • 1970-01-01
              • 2012-01-31
              • 1970-01-01
              • 2021-10-18
              • 2020-02-10
              • 2014-05-12
              • 1970-01-01
              相关资源
              最近更新 更多