我真的很喜欢 Objective-C 中的新文字。我想知道新增加的内容是否有更好的方法来比较数字。
例如,如果我想比较a
and b
:
a = @1;
b = @2;
是像这样比较它们的唯一方法:
[a intValue] > [b intValue]
还是有更好、更优雅的解决方案?
我真的很喜欢 Objective-C 中的新文字。我想知道新增加的内容是否有更好的方法来比较数字。
例如,如果我想比较a
and b
:
a = @1;
b = @2;
是像这样比较它们的唯一方法:
[a intValue] > [b intValue]
还是有更好、更优雅的解决方案?
对于相等性检查,您可以使用isEqualToNumber
which 检查id
or 内容是否相等(后者使用compare
):
if ([a isEqualToNumber:b]) // if a == b
不知道为什么他们也没有实现isGreaterThanNumber
和isLessThanNumber
方便的方法(可能>=
也<=
同样如此),因为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
选择更可取是您需要自己做出的决定。
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;
}
NSNumber 也有一个 isEqualToNumber:
这是检查哪个效果好的代码片段:
NSLog(@"%d", number1 == number2);
NSLog(@"%d", [number1 isEqual:number2]);
NSLog(@"%d", [number1 isEqualToNumber:number2]);
输出:
1
1
1
结论:
要了解比较,您需要了解实例分配。NSNumber 在内部实现了分配对象的缓存,并使用值将现有对象映射到任何新创建的对象。如果发现现有的 NSNumber 对象持有值 1,则不会创建新的 NSNumber 实例。