我非常喜欢Objective-C中的新文字。我想知道如果有新的增加,有一个更好的方法来比较数字。
例如,如果我想比较a
和b
:
a = @1;
b = @2;
这是比较它们的唯一方法:
[a intValue] > [b intValue]
还是有更好,更优雅的解决方案吗?
答案 0 :(得分:13)
对于相等性检查,您可以使用isEqualToNumber
检查id
或内容是否相等(后者使用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 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实例。