NSNumberとNSIntegerの違いは何ですか?私が知っておくべきこれらのようなプリミティブがもっとありますか?フロート用のものはありますか?
既存の回答は便利です。それらに追加する:
はい、NSUInteger
はNSInteger
の正の整数の2倍の範囲を与えますが、2つを選択するもう1つの重要な理由は、単純にケースを区別することだと思います負の値は単に意味をなしません。
例:NSArray
のcount
メソッドの戻り値はNSUInteger
です。負の数の要素。コーダーは、符号なしであることを知っている場合、シフトなどのビット単位の演算を含む、符号付きの場合には信頼性の低い演算を実行する自由があります。 このブログ投稿 署名済みと未署名について詳しく説明します。
私の推測CGFloat
vs NSFloat
(存在しない):デザイナーがNeXTSTEPで指定されたコード要素のうち、単に時間間隔以外のフロート値を多く指定する必要はありませんでした。そこで、彼らはNSTimeInterval
を与えました。これは浮動小数点型ですが、これは明らかに時間間隔での使用を意図しています。そして、率直に言って、このタイプを持つことは素晴らしいことです。なぜなら、構造体を処理する必要なく、常に数秒であることがわかっているからです。グラフィックスの世界(Core Graphicsが存在する場所)に移動すると、空中に浮かぶ浮遊物があなたの周りに突然現れます(笑)。したがって、CGFloat
をそこに導入するのは理にかなっています。この段落は、すべて「教育的な推測」です。
また、について明確にするために、プリミティブ型の代わりにNSInteger
などを使用する理由:この方法は移植可能なコードを書く方が簡単だからですマシンアーキテクチャを最大限に活用します。たとえば、CGFloat
は、一部のマシンで32ビットを使用し、他のマシンで64ビットを使用します。これは、これらのサイズのマシンの効率の差に大きく依存します。場合によっては、32ビット対64ビットを使用するための実際の高速化がないため、64ビットを使用することもできます。 CGFloat
として物事を宣言した場合、再コンパイルすると突然その余分な精度が「無料で」得られます。
そして、iKenndacが指摘したように、NSNumber
はこれら(およびその他のプリミティブまたは準プリミティブ型のすべて)のラッパークラスですBOOL
)を使用すると、NSArray
sおよびNSDictionary
sに含めることができ、より簡単にアーカイブできます。また、NSObject
sでできることを実行できます。
NSNumber
はプリミティブではなくクラスであり、辞書、配列、またはその他の方法でそれらをカプセル化する必要がある場合に使用されます。 NSInteger
、NSUInteger
、CGFloat
などは単純なタイプであり、iPhoneのような32 btシステムでは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
NSIntegerは、Cの従来のint
とまったく同じです。typedefです。 NSUInteger
、CGFloat
など、その他すべてがプリミティブ型の同義語です。
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を回避できない場合があります。
NSNumberは一般に変数の保存に使用され、NSUIntegerは算術に使用されます
nSNumberをNSUIntegerに変更するには、次を実行します。
NSNumber *variable = @1;
NSUInteger variableInt = [variable unsignedIntegerValue];
以前にも言われましたが、一般的な経験則として、*で定義する必要がある変数はObjective Cクラスであり、*を必要としない変数はCプリミティブです。
前に他の人が言ったように、NSNumber
はNSObject
サブクラスです。 Cプリミティブではありません(int、unsigned int、float、doubleなど)NSInteger
、CGFloat
、NSUInteger
はシンプルtypedefs
Cプリミティブ上。
NSNumber
が必要になるのは、オブジェクトを必要とするAPIのパラメーターとして数値を使用する必要があるためです。たとえば、NSArray
、In Core-Data、またはNSDictionary
に数値を格納する場合です。
私が知っておくべきこれらのようなプリミティブがもっとありますか? NSNumber
はプリミティブ型ではなく、あらゆる種類の数値(浮動小数点、整数型、ブール値など)をラップします。 NSNumber
のベースであるNSValueについても学ぶ必要があります。
フロート用のものはありますか? floatには「NS」typedefはありませんが、NSNumber
は浮動小数点数をラップできます。
NSNumber *myPi = [NSNumber numberWithFloat:3.1415926];
または、CoreGraphicsプリミティブ型CGFloatを使用できます。