Objective c NSNumber文本的比较

Objective c NSNumber文本的比较,objective-c,comparison,objective-c-literals,Objective C,Comparison,Objective C Literals,我真的很喜欢Objective-C中的新文字。我想知道是否有更好的方法来比较数字 例如,如果我想比较a和b: a = @1; b = @2; 只有这样才能比较它们: [a intValue] > [b intValue] 还是有更好、更优雅的解决方案?NSNumber实现了-比较:(其他许多类也是如此)。所以你可以说 switch ([a compare:b]) { case NSOrderedAscending: // a < b // blah bla

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

例如,如果我想比较
a
b

a = @1;
b = @2;
只有这样才能比较它们:

[a intValue] > [b intValue]

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

NSNumber
实现了
-比较:
(其他许多类也是如此)。所以你可以说

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;
}
开关([a比较:b]){
案例1:取消搜索://ab
//废话
打破
}

对于相等性检查,您可以使用
isEqualToNumber
检查
id
或内容是否相等(后者使用
比较
):


不确定为什么他们也没有实现
isGreaterThanNumber
isLessThanNumber
方便方法(可能
=
NSNumber也有一个IseQualNumber:

以下是代码片段,用于检查哪些方法工作正常:

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

1
1
1
结论:

1
1
1

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

好吧,可能是唯一添加的
IseQualtonumberr:
因为
isEqualTo…
方法在许多其他地方使用[比如
IseQualtString:
].只是我知道。谢谢…我不知道比较,但你还是不知道>=or@0xSina,如果你的意思是我没有指定一个简单的方法来做
=
啊,玩得很好。我现在觉得很笨,没有想到:)如果你愿意,你可以编写一个类别添加方法,比如
[a greaterThan:b]
[a equalTo:b]
编译器对运算符的重写最终可能会作为此数字文字语法的扩展出现
@1
已经变成了
[NSNumber numberWithInt:1]
——没有理由不允许
@1>@2
被重写为
[@1大于:@2]
(好吧,除了可能的混淆之外没有理由:“如果(1>@2)
,我为什么不能做
。”是的,它将删除低级指针比较…但它们总是可以执行类似于@1@>=@2的操作,然后在NSNumber中实现greaterThanOrEqualTo,因此它将被翻译为[@1 greaterThanOrEqualTo:@2]…通过这种方式,您可以保留指针算法和逻辑比较器。他们可以抛弃装箱原始类型的愚蠢想法,只需重新使用
int
:-)
if (nsnComp2 (a, b) >= 0)  ... // returns -1/0/+1
NSLog(@"%d", number1 == number2);
NSLog(@"%d", [number1 isEqual:number2]);
NSLog(@"%d", [number1 isEqualToNumber:number2]);
1
1
1