web-dev-qa-db-ja.com

NSNumberとNSIntegerの違いは何ですか?

NSNumberとNSIntegerの違いは何ですか?私が知っておくべきこれらのようなプリミティブがもっとありますか?フロート用のものはありますか?

61
mk12

既存の回答は便利です。それらに追加する:

はい、NSUIntegerNSIntegerの正の整数の2倍の範囲を与えますが、2つを選択するもう1つの重要な理由は、単純にケースを区別することだと思います負の値は単に意味をなしません

例:NSArraycountメソッドの戻り値はNSUIntegerです。負の数の要素。コーダーは、符号なしであることを知っている場合、シフトなどのビット単位の演算を含む、符号付きの場合には信頼性の低い演算を実行する自由があります。 このブログ投稿 署名済みと未署名について詳しく説明します。

私の推測CGFloat vs NSFloat(存在しない):デザイナーがNeXTSTEPで指定されたコード要素のうち、単に時間間隔以外のフロート値を多く指定する必要はありませんでした。そこで、彼らはNSTimeIntervalを与えました。これは浮動小数点型ですが、これは明らかに時間間隔での使用を意図しています。そして、率直に言って、このタイプを持つことは素晴らしいことです。なぜなら、構造体を処理する必要なく、常に数秒であることがわかっているからです。グラフィックスの世界(Core Graphicsが存在する場所)に移動すると、空中に浮かぶ浮遊物があなたの周りに突然現れます(笑)。したがって、CGFloatをそこに導入するのは理にかなっています。この段落は、すべて「教育的な推測」です。

また、について明確にするために、プリミティブ型の代わりにNSIntegerなどを使用する理由:この方法は移植可能なコードを書く方が簡単だからですマシンアーキテクチャを最大限に活用します。たとえば、CGFloatは、一部のマシンで32ビットを使用し、他のマシンで64ビットを使用します。これは、これらのサイズのマシンの効率の差に大きく依存します。場合によっては、32ビット対64ビットを使用するための実際の高速化がないため、64ビットを使用することもできます。 CGFloatとして物事を宣言した場合、再コンパイルすると突然その余分な精度が「無料で」得られます。

そして、iKenndacが指摘したように、NSNumberはこれら(およびその他のプリミティブまたは準プリミティブ型のすべて)のラッパークラスですBOOL)を使用すると、NSArraysおよびNSDictionarysに含めることができ、より簡単にアーカイブできます。また、NSObjectsでできることを実行できます。

52
Tyler

NSNumberはプリミティブではなくクラスであり、辞書、配列、またはその他の方法でそれらをカプセル化する必要がある場合に使用されます。 NSIntegerNSUIntegerCGFloatなどは単純なタイプであり、iPhoneのような32 btシステムではintunsigned intおよびfloat

一般的なルールとして、番号をどこかに保存する必要がある場合は、NSNumberを使用します。計算、ループなどを行う場合は、NSIntegerNSUInteger、またはCGFloatを使用します。

NSIntegerNSNumberにラップできます。

NSNumber *aNumber = [NSNumber numberWithInteger:21];

...そしてそれを取り戻します:

NSInteger anInteger = [aNumber integerValue];

詳細はこちらで確認できます: http://iosdevelopertips.com/cocoa/nsnumber-and-nsinteger.html

59
iKenndac

NSIntegerは、Cの従来のintとまったく同じです。typedefです。 NSUIntegerCGFloatなど、その他すべてがプリミティブ型の同義語です。

NSNumberは、NSArrayまたはNSDictionaryに数値を固定する必要がある場合に役立ちます。標準的な方法では、これらのコレクションを使用するのではなく、独自のコレクションを使用します。欠点は、Objective-Cオブジェクトのみを含めることができることです。

NSNumberは基本的にint(またはfloatなど)をObj-Cオブジェクトにラップし(C#/ Javaのプリミティブ型の「ボクシング」の概念と同様)、配列に追加できます。

NSArray * myArray = [[NSArray alloc] init];
[myArray addObject:3]; // invalid, will not compile.
[myArray [NSNumber numberWithInt:3]]; // ok

パフォーマンス上の理由から、可能であれば、プリミティブ型(int、float、int []など)を使用します。ただし、.plistファイルにエントリを読み書きする場合など、NSArray/NSNumberを回避できない場合があります。

6
Jason

NSNumberは一般に変数の保存に使用され、NSUIntegerは算術に使用されます

nSNumberをNSUIntegerに変更するには、次を実行します。

NSNumber *variable = @1;
NSUInteger variableInt = [variable unsignedIntegerValue];

以前にも言われましたが、一般的な経験則として、*で定義する必要がある変数はObjective Cクラスであり、*を必要としない変数はCプリミティブです。

2
eden

前に他の人が言ったように、NSNumberNSObjectサブクラスです。 Cプリミティブではありません(int、unsigned int、float、doubleなどNSIntegerCGFloatNSUIntegerはシンプルtypedefs Cプリミティブ上。

NSNumberが必要になるのは、オブジェクトを必要とするAPIのパラメーターとして数値を使用する必要があるためです。たとえば、NSArray、In Core-Data、またはNSDictionaryに数値を格納する場合です。

私が知っておくべきこれらのようなプリミティブがもっとありますか? NSNumberはプリミティブ型ではなく、あらゆる種類の数値(浮動小数点、整数型、ブール値など)をラップします。 NSNumberのベースであるNSValueについても学ぶ必要があります。

フロート用のものはありますか? floatには「NS」typedefはありませんが、NSNumberは浮動小数点数をラップできます。

NSNumber *myPi = [NSNumber numberWithFloat:3.1415926];

または、CoreGraphicsプリミティブ型CGFloatを使用できます。

0
Motti Shneor