比较目标C中的NSNumber


68

我是Objective-C的初学者,在这种情况下我有些困惑。我有以下代码:

if (number1 < number2) {
    NSLog(@"THE FOLLOWING NUMBER ");
    NSLog(@"%@", number1);
    NSLog(@"IS LESS THAN");
    NSLog(@"%@", number2);
}

当我运行此代码时,我看到的确是这样的奇怪结果:

2011-07-06 20:38:18.044 helloworld[1014:207] THE FOLLOWING NUMBER 
2011-07-06 20:38:18.047 helloworld[1014:207] 190.8776
2011-07-06 20:38:18.050 helloworld[1014:207] IS LESS THAN
2011-07-06 20:38:18.053 helloworld[1014:207] 96.75866

这两个数字都是NSNumber对象,怎么会这样呢?我通过查找屏幕上精灵之间的距离来获得两个数字。

任何线索或建议将不胜感激


1
请注意,您可以NSLog使用NSLog(@"THE NUMBER %@ IS LESS THAN %@", number1, number2);
Ben Leggiero

Answers:


112

我假设number1和number2是指向对象的指针。<符号比较指针。

您需要比较实际的floatValue或doubleValue

if ([number1 doubleValue] < [number2 doubleValue]) 

....


37
或者,您可以这样做if ([number1 compare:number2] == NSOrderedAscending)
亚当·罗森菲尔德

3
实话实说,我不赞成这样做:a)比较floats本质上是不一致的,并且实际上是无效的(如果有的话,将number1s的float值减去number2s的float值与一些小的epsil进行比较); b)floats是邪恶的,不可信任;doubles是可行的方式,并且c)如果它们是整数,则不必费心比较数字。@Adam Rosenfield的评论是最好的方法。trustNSNumber的比较方法可以为您解决这个问题。
伊泰·费伯

哦,而且,<在这种情况下,不比较指针。它在比较数字(NSNumber提供的实际值)。不想被误导!
Itai Ferber

@Itai虽然我同意使用-compare:,但是OP代码实际上是在比较指针(将内存地址转换为整数)。它没有比较NSNumber实例中的实际值。

@Bavarious Eh,哎呀?你是对的,我的错。误读了那部分。但是,我认为其余的评论仍然有效。
伊泰·费伯

40

对于只想测试两个NSNumber属性是否具有相同值的情况,从Apple文档看来,使用

- (BOOL)isEqualToNumber:(NSNumber *)aNumber

是比较两个NSNumber值的最直接,最有效的方法。

例如:

if ([someNumber isEqualToNumber:someOtherNumber])
{
    // The numbers hold the same value
}
else
{
    // The numbers hold different values
}

该文档还说:“这种方法比比较更有效:如果您知道两个对象是数字。”

每当您需要知道值是较小还是较大时,它们都会提供

- (NSComparisonResult)compare:(NSNumber *)aNumber

方法,但就我个人而言,我更喜欢此时仅取出整数值(或双精度值)并使用常规的<和>运算符进行比较,因为这样会使代码更易于阅读,例如:

if (firstNumber.intValue > secondNumber.intValue)
{
    // First number is greater than the second number
}
else if (firstNumber.intValue == secondNumber.intValue)
{
    // The two numbers have the same value
}
else
{
    // The first number is smaller than the second number
}

在我看来,类似这样的东西比调用-compare:更容易阅读。

埃里克


1
您说您将“抽取整数值或双精度值”。哪个?compare:方法将正确比较64位整数和不适合整数的大double值。在第一种情况下,提取双精度值将失败。在第二种情况下,提取整数将失败。使用比较:有效。
gnasher729 2014年

17

NSNumber有一个比较方法:-(NSComparisonResult)比较:(NSNumber *)aNumber

if([numberOne compare:numberTwo] == NSOrderedSame) 
{
      // proceed
}

3
这是执行此操作最准确,最可靠的方法,因为您不会冒失去精度的风险。
Ben Leggiero

0

斯威夫特3.1

let number1 = NSNumber(value: 10.2)
let number2 = NSNumber(value: 20.2)
let result = number1.compare(number2)
if  result == .orderedAscending {

} else if result == .orderedDescending {

} else { // .orderedSame

}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.