2011-01-25 53 views
100

如何增加一個NSNumber?如何增加一個NSNumber

即myNSNumber ++

+2

記住:使用`的NSNumber *`時,經常檢查,看看是否基本類型就足夠了。 – 2013-01-18 17:52:02

+0

我很驚訝,沒有答案提供快速/優化的方式,因爲只是爲了增加值,您需要查詢,組合並創建新對象,因此在循環中執行此操作可能會耗費大量時間。 – PetrV 2014-06-14 12:00:34

回答

119

更新:僅供參考,我個人比較喜歡BoltClock的和DarkDusts的一個在線回答更好。它們更簡潔,不需要額外的變量。


爲了增加一個NSNumber,你將必須得到它的價值,增加的是,並將其存儲在一個新的NSNumber

例如,對於一個NSNumber持有整數

NSNumber *number = [NSNumber numberWithInt:...]; 
int value = [number intValue]; 
number = [NSNumber numberWithInt:value + 1]; 

或爲NSNumber拿着浮點數:

NSNumber *number = [NSNumber numberWithDouble:...]; 
double value = [number doubleValue]; 
number = [NSNumber numberWithDouble:value + 1.0]; 
+56

這是我討厭核心數據中的NSNumber屬性的頭號原因。 NSNumber非常不方便使用和執行數學。 – 2011-10-04 18:51:20

+0

再次使用零進行初始化時,NSNumber不起作用,從而產生垃圾值。 – 2013-12-13 06:03:06

122

NSNumber對象是不可變;你能做的最好的就是抓住原始值,然後增加它包住結果在自己NSNumber對象:

NSNumber *bNumber = [NSNumber numberWithInt:[aNumber intValue] + 1]; 
+0

打我一秒......;) – 2011-01-25 12:00:48

+1

我挖這一行;謝謝。 – 2012-07-30 16:18:01

+24

現代語言:1,Objective-C:0. – devios1 2013-08-11 21:33:07

30

NSNumbers是不可變的,你必須創建一個新的實例。

// Work with 64 bit to support very large values 
myNSNumber = [NSNumber numberWithLongLong:[myNSNumber longLongValue] + 1]; 

// EDIT: With modern syntax: 
myNSNumber = @([myNSNumber longLongValue] + 1); 
76

對於誰正在使用最新版本的Xcode的任何人(寫這爲4.4.1,SDK 5.1),使用對象的文字,你可以清理代碼起來更有點..

NSNumber *x = @(1); 
x = @([x intValue] + 1); 
// x = 2 

仍然是一種痛苦的處理拳擊和拆箱的一切做簡單的操作,但它越來越好,或至少更短。

3

我喜歡點的表達,因爲它更簡潔,這就是爲什麼IOS支持它擺在首位:

myNSNumber = [NSNumber numberWithInt:myNSNumber.intValue + 1]; 
24

把它們放在一起,你必須:

myNSNumber = @(myNSNumber.intValue + 1); 
2

如果您使用它來存儲積分值:

myNSNumber = @(myNSNumber.longLongValue + 1); 

F或浮點數的東西,但簡短的回答是以下內容,但這樣做不好,你會失去精確性,如果你稍後進行任何形式的比較,比如[myNSNumber isEqual:@(4.5)],你可能會感到驚訝:

myNSNumber = @(myNSNumber.floatValue + 1); 

如果您需要對在Objective-C中表示爲對象的浮點數進行數學運算(即如果你需要把它們放入數組,字典等),你應該使用NSDecimalNumber

0

使用一個類別來減輕將來的使用。這是一個基本的想法。

- (void)incrementIntBy:(int)ammount { 
     self = [NSNumber numberWithInt:(self.intValue + ammount)]; 
} 
0

在這個問題的答案很多很好的信息。我在我的代碼中使用了選定的答案,它工作。然後我開始閱讀其餘的帖子並簡化了代碼。如果您不熟悉Xcode 5中引入的符號更改,但閱讀起來會更困難一些,但它會更清晰。我可能只是把它做成一行,但是弄清楚我在做什麼有點太難了。

我在字典中存儲了一個NSNumber,我想增加它。我得到它,將其轉換爲int,在將其轉換爲NSNumber時遞增,然後將其放回到字典中。

舊代碼

NSNumber *correct = [scoringDictionary objectForKey:@"correct"]; 
int correctValue = [correct intValue]; 
correct = [NSNumber numberWithInt:correctValue + 1]; 
[scoringDictionary removeObjectForKey:@"correct"]; 
scoringDictionary[@"correct"] = correct; 

新代碼

NSNumber *correct = [scoringDictionary objectForKey:@"correct"]; 
scoringDictionary[@"correct"] = @(correct.intValue + 1);