質問

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

役に立ちましたか?

解決

既存の回答は役に立ちます。それらに以下を追加します。

はい、 NSUInteger 正の整数の範囲を 2 倍にします。 NSInteger, しかし、この 2 つのどちらかを選択するもう 1 つの重要な理由は、単純にケースを区別するためだと思います。 負の値は単に意味をなさない場合.

例: の戻り値 NSArrayさんの count 方法は NSUInteger, 負の数の要素を含む配列を使用できないため、これは理にかなっています。符号なしであることがわかれば、符号付きの場合には信頼性が低い可能性がある演算 (シフトなどのビット単位の演算を含む) をより自由に実行できるようになります。 このブログ投稿 署名付きと署名なしについて詳しく説明します。

についての私の推測 CGFloatNSFloat (存在しません):NeXTStep という名前のコード要素の設計者が、時間間隔の外であまりにも多くの浮動小数点値を指定する必要がなかっただけかもしれません。それで彼らは与えました NSTimeInterval, これは浮動小数点型ですが、明らかに時間間隔での使用を目的としています。そして、率直に言って、この型があるのは素晴らしいことです。構造体を処理する必要がなく、常に数秒で処理できることがわかっているからです。グラフィックスの世界 (Core Graphics が存在する) に移動すると、突然フロートがあなたの周りに現れ、空中に浮かんでいます (笑)。したがって、を導入するのは理にかなっています CGFloat そこには。この段落はすべて「知識に基づいた推測」です。

また、念のために言っておきますが、 なぜ使用するのか NSInteger プリミティブ型の代わりになど:この方法により、マシン アーキテクチャを最大限に活用した移植可能なコードを簡単に作成できるからです。たとえば、 CGFloat は、一部のマシンでは 32 ビットを使用し、他のマシンでは 64 ビットを使用します。これは主に、それらのサイズのマシンにどれだけの効率の差があるかによって決まります。場合によっては、32 ビットと 64 ビットを使用しても実際の速度向上は見られないため、64 ビットを使用したほうがよいでしょう。次のように宣言した場合 CGFloat再コンパイルすると、突然追加の精度が「無料」で得られます。

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

他のヒント

NSNumberはクラスではなく、原始的で、そしてあなたは、辞書の中に生の数値を入れる配列、あるいはそれらをカプセル化する必要があるときに使用されます。等NSIntegerNSUIntegerCGFloat、単純型であり、intunsigned intfloatする(iPhoneのような32-BTシステムに)対応する。

あなたがどこかに番号を保存する必要がある場合は、

一般的なルールとして、NSNumberを使用しています。あなたは計算をやっている場合など、ループ、NSIntegerNSUIntegerまたはCGFloatを使用しています。

あなたはNSIntegerNSNumberをラップすることができます:

NSNumber *aNumber = [NSNumber numberWithInteger:21];

...と、それを取り戻すます:

NSInteger anInteger = [aNumber integerValue];

あなたがここでより多くの情報を見つけることができます: http://iosdevelopertips.com/cocoa /nsnumber-and-nsinteger.htmlする

NSIntegerはちょうどそれはtypedefのだC.で伝統的なintのようなものです。すべてのプリミティブ型の同義語ですなどNSUIntegerCGFloat、のような他の人があります。

あなたがたNSArrayやNSDictionaryのに数を固執する必要があるときに

の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のクラスがある*で定義する必要がある変数として言われています。

NSNumberNSObjectサブクラスで、前に他の人が言ったように。それは(int型、unsigned int型、float型、ダブル、などのように、の)プリミティブCではないNSIntegerCGFloatNSUIntegerはCプリミティブの上にシンプルtypedefsされます。

NSNumberの必要性は、オブジェクトを必要とするAPIへのパラメータとして番号を使用する必要性から生じます。例を使用すると、コア・データでは、NSArrayに番号を保存したいとき、ある、またはNSDictionaryインチ

が、私が知っておくべきこれらのようなより多くのプリミティブはありますか?まあ、NSNumberは、プリミティブ型ではない、それはすべての数字の種類(山車、整数型、ブールなど)がラップアラウンドします。またNSNumberためのベースであるNSValue、学ぶ必要があります。

フロートのための1つはありますか?そこフロートには、「NS」のtypedefはありませんが、NSNumberは任意の浮動小数点数の周りをラップすることができます:

NSNumber *myPi = [NSNumber numberWithFloat:3.1415926];

それとも、CoreGraphicsを使用することができプリミティブ型CGFloatます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top