NSNumberをインクリメントするにはどうすればよいですか?
つまり、myNSNumber ++
NSNumberをインクリメントするにはどうすればよいですか?
つまり、myNSNumber ++
回答:
更新:参考までに、私は個人的にはBoltClockとDarkDustsの1行回答の方が好きです。それらはより簡潔であり、追加の変数を必要としません。
をインクリメントするには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];
...
略ですか?疑似コード参照でしょ?XCodeは対応していません...
...
は、必要な数のプレースホルダーにすぎません。
Xcodeの最新バージョン(4.4.1、SDK 5.1の時点でこれを記述)を使用している人は、オブジェクトリテラルを使用して、コードを少しでもクリーンアップできます...
NSNumber *x = @(1);
x = @([x intValue] + 1);
// x = 2
単純な操作を実行するためにすべてのボックス化とボックス化解除を処理するのは依然としてやや面倒ですが、改善されているか、少なくとも短くなっています。
それらをすべてまとめると、次のようになります。
myNSNumber = @(myNSNumber.intValue + 1);
NSNumber
オブジェクトは不変(?)
ドット式の方が簡潔で、IOSがそもそもサポートしているので、ドット式が好きです。
myNSNumber = [NSNumber numberWithInt:myNSNumber.intValue + 1];
整数値を格納するためにそれを使用している場合:
myNSNumber = @(myNSNumber.longLongValue + 1);
浮動小数点のものについての短い答えは次のとおりですが、これを行うことは悪い考えです。精度が失われ、後で[myNSNumber isEqual:@(4.5)]のような種類の比較を行っている場合、驚くかもしれません:
myNSNumber = @(myNSNumber.floatValue + 1);
Objective-Cでオブジェクトとして表される浮動小数点数を計算する必要がある場合(つまり、配列、辞書などに配置する必要がある場合)は、を使用する必要がありますNSDecimalNumber
。
将来の使用を容易にするためにカテゴリを使用します。これが基本的な考え方です。
- (void)incrementIntBy:(int)ammount {
self = [NSNumber numberWithInt:(self.intValue + ammount)];
}
この質問への回答にはたくさんの良い情報があります。私はコードで選択した回答を使用し、それが機能しました。その後、残りの投稿を読み始め、コードを大幅に簡略化しました。Xcode 5で導入された表記法の変更に慣れていないと、少し読みづらくなりますが、かなりわかりやすくなっています。たぶん1行にすることもできますが、何をしているのか理解するのが少し難しいです。
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);
NSNumber *
、必ずプリミティブ型で十分かどうかを確認してください。