我非常喜歡Objective-C中的新文字。我想知道是否有新的增加有一個更好的方式來比較數字。NSNumber文字的比較
例如,如果我想比較a
和b
:
a = @1;
b = @2;
對他們這樣比較的唯一途徑:
[a intValue] > [b intValue]
還是有更好,更優雅,解決方案?
我非常喜歡Objective-C中的新文字。我想知道是否有新的增加有一個更好的方式來比較數字。NSNumber文字的比較
例如,如果我想比較a
和b
:
a = @1;
b = @2;
對他們這樣比較的唯一途徑:
[a intValue] > [b intValue]
還是有更好,更優雅,解決方案?
對於平等的檢查,你可以使用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
選項更可取,您需要做出決定。
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;
}
的NSNumber也有一個isEqualToNumber:
這裏是代碼片段,以檢查其做工不錯:
NSLog(@"%d", number1 == number2);
NSLog(@"%d", [number1 isEqual:number2]);
NSLog(@"%d", [number1 isEqualToNumber:number2]);
輸出:
1
1
1
結論:
爲了理解比較,您需要了解實例分配。NSNumber內部實現了分配對象的緩存,並使用值將現有對象映射到任何新創建的對象。如果找到的現有NSNumber對象的值爲1,則不會創建新的NSNumber實例。
如果你願意,你可以編寫一個類別添加方法,如'[a greaterThan:b]'和'[a equalTo:b]' – pasawaya
可能編譯器重寫操作符最終會作爲這個數字文字的擴展出現句法。 '@ 1'已經變成'[NSNumber numberWithInt:1]' - 沒有理由不允許'@ 1> @ 2'被重寫爲'[@ 1 isGreaterThan:@ 2]'(沒有理由除了可能的困惑之外:「爲什麼我不能'如果(1> @ 2)'?」)。 –
是的,你是對的,它會帶走低級別的指針比較...但他們總是可以做@ 1 @> = @ 2然後在NSNumber中實現greaterThanOrEqualTo,所以它會被翻譯爲[@ 1 greaterThanOrEqualTo: @ 2] ...這樣你可以保持你的指針算術以及邏輯比較 – 0xSina