6

我真的很喜欢 Objective-C 中的新文字。我想知道新增加的内容是否有更好的方法来比较数字。

例如,如果我想比较aand b

a = @1;
b = @2;

是像这样比较它们的唯一方法:

[a intValue] > [b intValue]

还是有更好、更优雅的解决方案?

4

4 回答 4

13

对于相等性检查,您可以使用isEqualToNumberwhich 检查idor 内容是否相等(后者使用compare):

if ([a isEqualToNumber:b])                  // if a == b

不知道为什么他们也没有实现isGreaterThanNumberisLessThanNumber方便的方法(可能>=<=同样如此),因为compare下面的方法看起来有点笨拙。

对于不等式检查,只需compare直接使用(您也可以对等式执行此操作,从下面的第一个可以看出):

if ([a compare:b] == NSOrderedSame)         // if (a == b)
if ([a compare:b] == NSOrderedAscending)    // if (a <  b)
if ([a compare:b] == NSOrderedDescending)   // if (a >  b)

if ([a compare:b] != NSOrderedSame)         // if (a != b)
if ([a compare:b] != NSOrderedAscending)    // if (a >= b)
if ([a compare:b] != NSOrderedSescending)   // if (a <= b)

详细信息可以在NSNumber 类文档页面上找到。


请记住,没有什么可以阻止您创建自己的辅助函数,例如,允许以下代码:

if (nsnComp1 (a, ">=", b)) ... // returns true/false (yes/no)

或者:

if (nsnComp2 (a, b) >= 0)  ... // returns -1/0/+1

即使它更少 Objective-C 而更多 C :-) 这取决于您对“优雅”的定义是否主要受效率或可读性的约束。这是否比您的intValue选择更可取是您需要自己做出的决定。

于 2012-09-11T01:59:57.277 回答
7

NSNumber实现-compare:(与许多其他类一样)。所以你可以说

switch ([a compare:b]) {
    case NSOrderedAscending: // a < b
        // blah blah
        break;
    case NSOrderedSame: // a == b
        // blah blah
        break;
    case NSOrderedDescending: // a > b
        // blah blah
        break;
}
于 2012-09-11T01:57:15.907 回答
0

NSNumber 也有一个 isEqualToNumber:

于 2012-09-11T02:00:02.100 回答
0

这是检查哪个效果好的代码片段:

NSLog(@"%d", number1 == number2);
NSLog(@"%d", [number1 isEqual:number2]);
NSLog(@"%d", [number1 isEqualToNumber:number2]);

输出:

1
1
1

结论:

要了解比较,您需要了解实例分配。NSNumber 在内部实现了分配对象的缓存,并使用值将现有对象映射到任何新创建的对象。如果发现现有的 NSNumber 对象持有值 1,则不会创建新的 NSNumber 实例。

于 2016-07-08T10:23:50.537 回答