NSNumber文字的比较

时间:2012-09-11 01:55:15

标签: objective-c comparison objective-c-literals

我非常喜欢Objective-C中的新文字。我想知道如果有新的增加,有一个更好的方法来比较数字。

例如,如果我想比较ab

a = @1;
b = @2;

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

[a intValue] > [b intValue]

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

4 个答案:

答案 0 :(得分:13)

对于相等性检查,您可以使用isEqualToNumber检查id或内容是否相等(后者使用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 class documentation page上找到。


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

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

或:

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

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

答案 1 :(得分: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;
}

答案 2 :(得分:0)

NSNumber还有一个isEqualToNumber:

答案 3 :(得分:0)

以下是检查哪些内容有效的代码段:

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

输出:

1
1
1

<强>结论:

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