NSNumber文字的比较

0xS*_*ina 6 comparison objective-c objective-c-literals

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

例如,如果我想比较ab:

a = @1;
b = @2;
Run Code Online (Sandbox Code Playgroud)

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

[a intValue] > [b intValue]
Run Code Online (Sandbox Code Playgroud)

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

pax*_*blo 13

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

if ([a isEqualToNumber:b])                  // if a == b
Run Code Online (Sandbox Code Playgroud)

不知道为什么他们还没有实现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)
Run Code Online (Sandbox Code Playgroud)

可以在NSNumber类文档页面上找到详细信息.


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

if (nsnComp1 (a, ">=", b)) ... // returns true/false (yes/no)
Run Code Online (Sandbox Code Playgroud)

要么:

if (nsnComp2 (a, b) >= 0)  ... // returns -1/0/+1
Run Code Online (Sandbox Code Playgroud)

即使它更少Objective-C和更多C :-)这取决于你对"优雅"的定义是否主要受效率或可读性的约束.这是否比你的intValue选择更可取决定你需要做出决定.


Lil*_*ard 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;
}
Run Code Online (Sandbox Code Playgroud)