2012-09-11 40 views
6

我非常喜歡Objective-C中的新文字。我想知道是否有新的增加有一個更好的方式來比較數字。NSNumber文字的比較

例如,如果我想比較ab

a = @1; 
b = @2; 

對他們這樣比較的唯一途徑:

[a intValue] > [b intValue] 

還是有更好,更優雅,解決方案?

+0

如果你願意,你可以編寫一個類別添加方法,如'[a greaterThan:b]'和'[a equalTo:b]' – pasawaya

+0

可能編譯器重寫操作符最終會作爲這個數字文字的擴展出現句法。 '@ 1'已經變成'[NSNumber numberWithInt:1]' - 沒有理由不允許'@ 1> @ 2'被重寫爲'[@ 1 isGreaterThan:@ 2]'(沒有理由除了可能的困惑之外:「爲什麼我不能'如果(1> @ 2)'?」)。 –

+0

是的,你是對的,它會帶走低級別的指針比較...但他們總是可以做@ 1 @> = @ 2然後在NSNumber中實現greaterThanOrEqualTo,所以它會被翻譯爲[@ 1 greaterThanOrEqualTo: @ 2] ...這樣你可以保持你的指針算術以及邏輯比較 – 0xSina

回答

13

對於平等的檢查,你可以使用isEqualToNumber用來檢查是否無論是id或含量等於(後者使用compare):

if ([a isEqualToNumber:b])     // if a == b 

不知道爲什麼他們也沒有實現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) 

詳情,可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選項更可取,您需要做出決定。

+0

對我來說太快了! :D – Zhang

+0

好吧,可能只添加了'isEqualToNumber:',因爲'isEqualTo ...'方法在很多其他地方使用[比如'isEqualToString:']。只是恕我直言。 – Mazyod

+0

謝謝...不知道比較,但你仍然不知道> =或<= ....如果他們做@ 1 == @ 2會更令人敬畏......但我明白爲什麼不。 – 0xSina

7

NSNumber implements -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; 
} 
0

的NSNumber也有一個isEqualToNumber:

0

這裏是代碼片段,以檢查其做工不錯:

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

輸出:

1 
1 
1 

結論:

爲了理解比較,您需要了解實例分配。NSNumber內部實現了分配對象的緩存,並使用值將現有對象映射到任何新創建的對象。如果找到的現有NSNumber對象的值爲1,則不會創建新的NSNumber實例。