NSNumber と NSInteger の違いは何ですか? 私が知っておくべきこれらのようなプリミティブは他にありますか? フロート用はありますか?
5 に答える
NSNumber
プリミティブではなくクラスであり、生の数値を辞書や配列に入れる必要がある場合、またはカプセル化する必要がある場合に使用されます。NSInteger
、NSUInteger
、CGFloat
などは単純な型で、(iPhone などの 32 ビット システムでは) 、 、 に対応int
しunsigned int
ますfloat
。
原則として、数値をどこかに格納する必要がある場合は、 を使用しますNSNumber
。計算やループなどを行う場合はNSInteger
、NSUInteger
またはを使用しますCGFloat
。
NSInteger
を にラップできますNSNumber
:
NSNumber *aNumber = [NSNumber numberWithInteger:21];
...そしてそれを取り戻します:
NSInteger anInteger = [aNumber integerValue];
ここで詳細情報を見つけることができます: http://iosdevelopertips.com/cocoa/nsnumber-and-nsinteger.html
既存の回答は役に立ちます。それらに追加:
はい、NSUInteger
正の整数の間で の 2 倍の範囲を与えますが、この 2 つを選択するもう 1 つの重要な理由は、単に負の値が単に意味をなさないNSInteger
場合を区別するためだと思います。
例:NSArray
のcount
メソッドの戻り値はNSUInteger
です。負の数の要素を持つ配列を持つことはできないため、これは理にかなっています。コーダーが符号なしであることを知っている場合、シフトなどのビットごとの操作を含む、符号付きの場合には信頼できない操作を実行する自由が増えます。 このブログ投稿では、署名されたものと署名されていないものについて詳しく説明しています。
CGFloat
vsNSFloat
についての私の推測(これは存在しません): NeXTStep という名前のコード要素の設計者が、時間間隔以外であまりにも多くの float 値を指定する必要がなかったのかもしれません。NSTimeInterval
そのため、浮動小数点型である が与えられましたが、これは明らかに時間間隔での使用を意図しています。そして、率直に言って、構造体を処理する必要がなく、常に数秒であることがわかっているので、その型があることは素晴らしいことです。グラフィックスの世界 (Core Graphics が住んでいる場所) に移動すると、突然、浮遊物が周囲に漂い、宙に浮いています (笑)。したがって、そこに a を導入することは理にかなってCGFloat
います。この段落はすべて「知識に基づいた憶測」です。
また、プリミティブ型の代わりに etc を使用する理由をNSInteger
明確にするために、この方法を使用すると、マシン アーキテクチャを最大限に活用する移植可能なコードを簡単に作成できるためです。たとえば、CGFloat
一部のマシンでは 32 ビットを使用し、他のマシンでは 64 ビットを使用しますが、これらのサイズのマシンにどれだけの効率ギャップがあるかに大きく依存します。場合によっては、32 ビットを使用した場合と 64 ビットを使用した場合では実際のスピードアップがないため、64 ビットを使用することもできます。を 'sとして宣言しCGFloat
た場合、再コンパイルすると突然、追加の精度が「無料で」得られます。
そして、iKenndac が指摘したように、これらすべて (および のような他のプリミティブ型または準プリミティブ型)NSNumber
のラッパー クラスであり、それをs およびsBOOL
に含めたり、より簡単にアーカイブしたり、他のことを実行したりできます。できる。NSArray
NSDictionary
NSObject
NSInteger はint
、C の従来のようなものです。これは typedef です。、などNSUInteger
、CGFloat
すべてがプリミティブ型の同義語です。
NSNumber は、数値を NSArray または NSDictionary に貼り付ける必要がある場合に役立ちます。標準的な方法は、独自のコレクションではなく、これらのコレクションを使用することです。欠点は、Objective-C オブジェクトしか含めることができないことです。
NSNumber は本質的int
に、配列に追加できる Obj-C オブジェクト (プリミティブ型を「ボックス化」する C#/Java の概念と同様) (または float など) をラップします。
NSArray * myArray = [[NSArray alloc] init];
[myArray addObject:3]; // invalid, will not compile.
[myArray [NSNumber numberWithInt:3]]; // ok
パフォーマンス上の理由から、可能であればプリミティブ型 (int、float、int[] など) を使用してください。ただし、エントリをファイルに読み書きする場合など、NSArray/NSNumber を回避できない場合があり.plist
ます。
前に他の人が言ったようにNSNumber
、NSObject
サブクラスです。これは C プリミティブ ( int、unsigned int、float、double など)NSInteger
ではありません。C プリミティブCGFloat
よりNSUInteger
単純typedefs
です。
の必要性はNSNumber
、オブジェクトを必要とする API へのパラメーターとして数値を使用する必要性から生じます。例としては、数値を 、NSArray
コア データ内、またはNSDictionary
.
私が知っておくべきこれらのようなプリミティブは他にありますか? プリミティブ型でNSNumber
はなく、あらゆる種類の数値 (浮動小数点数、整数型、ブール値など) をラップします。のベースとなる NSValue についても学ぶ必要がありますNSNumber
。
フロート用はありますか?float の "NS" typedef はありませんが、NSNumber
任意の float 番号をラップできます。
NSNumber *myPi = [NSNumber numberWithFloat:3.1415926];
または、CoreGraphics プリミティブ型 CGFloat を使用することもできます。