NSNumber と NSInteger の違いは何ですか?
-
18-09-2019 - |
質問
NSNumber と NSInteger の違いは何ですか?知っておくべきこのようなプリミティブは他にもありますか?フロート用のものはありますか?
解決
既存の回答は役に立ちます。それらに以下を追加します。
はい、 NSUInteger
正の整数の範囲を 2 倍にします。 NSInteger
, しかし、この 2 つのどちらかを選択するもう 1 つの重要な理由は、単純にケースを区別するためだと思います。 負の値は単に意味をなさない場合.
例: の戻り値 NSArray
さんの count
方法は NSUInteger
, 負の数の要素を含む配列を使用できないため、これは理にかなっています。符号なしであることがわかれば、符号付きの場合には信頼性が低い可能性がある演算 (シフトなどのビット単位の演算を含む) をより自由に実行できるようになります。 このブログ投稿 署名付きと署名なしについて詳しく説明します。
についての私の推測 CGFloat
対 NSFloat
(存在しません):NeXTStep という名前のコード要素の設計者が、時間間隔の外であまりにも多くの浮動小数点値を指定する必要がなかっただけかもしれません。それで彼らは与えました NSTimeInterval
, これは浮動小数点型ですが、明らかに時間間隔での使用を目的としています。そして、率直に言って、この型があるのは素晴らしいことです。構造体を処理する必要がなく、常に数秒で処理できることがわかっているからです。グラフィックスの世界 (Core Graphics が存在する) に移動すると、突然フロートがあなたの周りに現れ、空中に浮かんでいます (笑)。したがって、を導入するのは理にかなっています CGFloat
そこには。この段落はすべて「知識に基づいた推測」です。
また、念のために言っておきますが、 なぜ使用するのか NSInteger
プリミティブ型の代わりになど:この方法により、マシン アーキテクチャを最大限に活用した移植可能なコードを簡単に作成できるからです。たとえば、 CGFloat
は、一部のマシンでは 32 ビットを使用し、他のマシンでは 64 ビットを使用します。これは主に、それらのサイズのマシンにどれだけの効率の差があるかによって決まります。場合によっては、32 ビットと 64 ビットを使用しても実際の速度向上は見られないため、64 ビットを使用したほうがよいでしょう。次のように宣言した場合 CGFloat
再コンパイルすると、突然追加の精度が「無料」で得られます。
そして、iKenndac 氏が指摘したように、 NSNumber
すべてのラッパークラスです これらのうち (および他のプリミティブまたは準プリミティブ型のような) BOOL
) これにより、それを NSArray
砂 NSDictionary
より簡単にアーカイブしたり、その他のことを行うことができます。 NSObject
できるよ。
他のヒント
NSNumber
はクラスではなく、原始的で、そしてあなたは、辞書の中に生の数値を入れる配列、あるいはそれらをカプセル化する必要があるときに使用されます。等NSInteger
、NSUInteger
、CGFloat
、単純型であり、int
とunsigned int
をfloat
する(iPhoneのような32-BTシステムに)対応する。
一般的なルールとして、NSNumber
を使用しています。あなたは計算をやっている場合など、ループ、NSInteger
、NSUInteger
またはCGFloat
を使用しています。
あなたはNSInteger
にNSNumber
をラップすることができます:
NSNumber *aNumber = [NSNumber numberWithInteger:21];
...と、それを取り戻すます:
NSInteger anInteger = [aNumber integerValue];
あなたがここでより多くの情報を見つけることができます: http://iosdevelopertips.com/cocoa /nsnumber-and-nsinteger.htmlする
NSIntegerはちょうどそれはtypedefのだC.で伝統的なint
のようなものです。すべてのプリミティブ型の同義語ですなどNSUInteger
、CGFloat
、のような他の人があります。
のNSNumberに便利です。標準的な方法は、あなた自身をロール対これらのコレクションを使用することです。欠点は、彼らが唯一のObjective-Cのオブジェクトを含めることができるということです。
のNSNumberは、本質的に、アレイに添加することができる(プリミティブ型「ボクシング」のC#/ Javaの概念に類似)は、obj-Cオブジェクトにint
(またはフロートなど)ラップ
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を演算するために使用される
あなたはこれを行うことによって、NSUIntegerへのNSNumberを変更することができます:
NSNumber *variable = @1;
NSUInteger variableInt = [variable unsignedIntegerValue];
*を必要としない変数がCプリミティブあるのに対し、前が、親指の一般的なルール、Objective Cのクラスがある*で定義する必要がある変数として言われています。
NSNumber
がNSObject
サブクラスで、前に他の人が言ったように。それは(int型、unsigned int型、float型、ダブル、などのように、のの)プリミティブCではないNSInteger
、CGFloat
、NSUInteger
はCプリミティブの上にシンプルtypedefs
されます。
NSNumber
の必要性は、オブジェクトを必要とするAPIへのパラメータとして番号を使用する必要性から生じます。例を使用すると、コア・データでは、NSArray
に番号を保存したいとき、ある、またはNSDictionary
インチ
が、私が知っておくべきこれらのようなより多くのプリミティブはありますか?まあ、NSNumber
は、プリミティブ型ではない、それはすべての数字の種類(山車、整数型、ブールなど)がラップアラウンドします。またNSNumber
ためのベースであるNSValue、学ぶ必要があります。
フロートのための1つはありますか?そこフロートには、「NS」のtypedefはありませんが、NSNumber
は任意の浮動小数点数の周りをラップすることができます:
NSNumber *myPi = [NSNumber numberWithFloat:3.1415926];
それとも、CoreGraphicsを使用することができプリミティブ型CGFloatます。