【问题标题】:Compare a NSNumber to an int将 NSNumber 与 int 进行比较
【发布时间】:2010-10-17 20:03:09
【问题描述】:

我有一个简单的问题(我认为): 我正在尝试将 NSNumber 与 int 进行比较,以查看它是 0 还是 1。代码如下:

id i = [dictionary objectForKey:@"error"]; //class = NSCFNumber

NSLog(@"%@ == 0 -> %@", i, i == 0);
NSLog(@"%@ == 0 -> %@", i, [i compare:[NSNumber numberWithBool:NO]]);

我对方法进行了尝试,但结果为 null:

2010-10-17 21:57:49.065 Api[15152:a0f] 0 == 0 -> (null)
2010-10-17 21:57:49.065 Api[15152:a0f] 0 == 0 -> (null)

你能帮帮我吗?

【问题讨论】:

    标签: objective-c compare nsnumber


    【解决方案1】:

    你可以轻松写:

    NSNumber *number = [NSNumber numberWithInt:123];
    int integer = 1234;
    
    NSLog(@"%@ == %i : %i", number, integer, [number intValue] == integer);
    

    输出应该是

    123 == 1234 : 0
    


    希望能帮到你!

    【讨论】:

      【解决方案2】:
      1. 比较的结果是一个 BOOL,它不是一个 Objective-C 对象。因此,您应该使用%@ 打印它。改用%d(显示 0 或 1)。

      2. [a compare:b] 如果a < b 返回-1,如果a == b 返回0,如果a > b 返回1。所以你的第二个结果是预期的。

      3. 您不能直接将 NSNumber 与整数进行比较。 i == 0 实际上是一个 pointer 比较,它检查 i 是否为 NULL (0),如果该数字存在,这当然是 FALSE。所以第一个结果也是预期的。

      4. 如果你想检查是否相等,use [a isEqualToNumber:b]。或者,您可以使用[a intValue] 提取整数并直接与另一个整数进行比较。

      所以以下应该可以工作:

      NSLog(@"%@ == 0 -> %d", i, [i isEqualToNumber:[NSNumber numberWithInt:0]]);
      NSLog(@"%@ == 0 -> %d", i, [i intValue] == 0);
      

      如果“数字”实际上是一个布尔值,最好使用-boolValue

      NSLog(@"%@ == 0 -> %d", i, ! [i boolValue]);
      

      【讨论】:

      • 我应该记住我不要使用 %@ :) 谢谢 ;)
      【解决方案3】:

      这里你将对象 i 的指针与 0 进行比较,这恐怕不是你想要的。

      你很可能想比较 i 的值:

      if ([i intValue]==0) {
        ...
      }
      

      【讨论】:

        【解决方案4】:

        你有两个问题:

        • 您将 NSNumber 对象与其所代表的值混淆了。
        • 您的NSLog 格式字符串与您提供的参数类型不匹配。

        关于第一个问题:i 是一个地址,可能类似于0x1f84b。当您测试是否i == 0 时,您正在测试是否i == NULL。在这种情况下,这意味着您正在测试字典中是否存在键“错误”,因为查找不存在的键会获得 NULL

        [i intValue],另一方面,是一个整数。如果NSNumber 包含可表示为整数的值,则这将是NSNumber 的值。这就是您使用%@ 格式说明符打印NSNumber 的描述时看到的内容。

        关于第二个问题:C 和 Objective-C 中的比较返回一个整数,0(表示假)或 1(表示真)。为了直接打印比较结果,您需要使用整数格式说明符。实际上有两个这样的说明符,%i%d。您可以将比较结果包装在一个 NSNumber 中并使用%@ 来打印它,但这比它的价值更多。

        所以,这就是你应该做的:

        NSNumber *i = [dictionary objectForKey:@"error"];
        BOOL haveValue = (i != NULL);
        if (haveValue) {
            int iValue = [i intValue];
            NSLog(@"%d == 0 -> %d", iValue, iValue == 0);
            NSLog(@"%@ compared to 0 -> %d", i, [i compare:[NSNumber numberWithInt:0]]);
        } else {
            NSLog(@"*** Dictionary has no value for key \"error\"!");
        }
        

        【讨论】:

          【解决方案5】:

          成功了

          if (thevariable.intValue==0) {
            ...
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-09-13
            • 2013-04-05
            • 1970-01-01
            • 2020-08-28
            相关资源
            最近更新 更多