NSIntegerをintに変換する方法は?


97

たとえば、そのようなインスタンスにvalueメッセージを渡すときNSInteger

[a value] EXC_BAD_ACCESSが発生します。

それでは、どのように変換するNSIntegerにはint

関連する場合は、32未満の小さな数値のみが使用されます。


2
あなたはかなり混乱しているようです。[値]は、がオブジェクトであることを期待していることを示していますが、現時点ではNSIntegerです。intへの「変換」はその問題を解決しません。
マイクアブドラ

回答:


205

多田:

NSInteger myInteger = 42;
int myInt = (int) myInteger;

NSInteger32/64ビット整数にすぎません。(実行しているOS /プラットフォームに基づいて適切なサイズを使用します)


13
正確には、NSIntegerは32ビットプラットフォームではintであり、64ビットプラットフォームではlongであると思います。
フレデリック・ダッダ

5
「INT」に(「unsigned long型」別名「)NSUInteger」:暗黙的な変換が精度整数失う:私が提案し、「キャスト」を使用して警告を受ける
djcj

@djcj、はい、答えは新しいSDKでは正しくありません。おもう。
Azik Abdullah 2014

NSIntegerの前に(int)を置くだけの方がはるかに簡単ではないでしょうか?たとえば、整数型を呼び出したいときは常に(int)myIntegerなので、新しい変数を作成する必要はありません。
chandhooguy 14

2
@chandhooguy新しい変数を回避しようとしているのはなぜですか?
Dan Rosenstark、2015年

28

これをインラインで実行したい場合は、NSUIntegerまたはNSIntegerをにキャストしますint

int i = -1;
NSUInteger row = 100;
i > row // true, since the signed int is implicitly converted to an unsigned int
i > (int)row // false

1
好奇心から、2桁の投票ですでに承認済みの回答がある質問に、事実の2年後に回答を投稿するのはなぜですか?特にあなたの答えは単にその答えを言い換えただけなので。
Lily Ballard

6
私の答えは単一の行なので(インライン型キャスト-(int)を使用)、これはOPが望むものだと思います。私はこれを自分で調べたところ、この件に関するすべての回答が複数行になっていることに気付きました。
Samuel Clay

2
受け入れられた答えは、単一の行を使用した暗黙の変換を示しています。Abizernの答えはNSInteger、の代わりに値を使用しようとすると暗黙の変換が行われることを説明していますint。どちらの場合も、複数行のソリューションではありません。
Lily Ballard

25
私はもっ​​とはっきりしていたはずです。これはやや初心者の質問なので、初心者プログラマーが(int)式を使用してインラインで変換できることは明らかではないかもしれません。他の答えはこれを示していません、そして私はそれがこのページで偶然見つけた人を助けると思います。
Samuel Clay、

4
そして、私はこのページにさらに1年半後、特にNSUInteger関連のキャストを必要として、つまずきました。ありがとう、サミュエル!
リーン、2014

18

私はあなたが変換する必要がある状況についてはよく分からないNSIntegerint

NSIntegerは単なるtypedefです。

NSInteger 32ビットシステムと64ビットシステムのどちらを構築するかに関係なく、整数を記述するために使用されます。

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 
typedef long NSInteger;
#else
typedef int NSInteger;
#endif

変換せずにNSInteger、どこでも使用できますint


2
ここに、NSUintegerをintに変換したい正当な理由があります:値の比較。(int i = -1)>(NSUinteger j = 14)は、intを符号なし、つまり-1> 14に変換しますが、これは必要なことではありません。
Samuel Clay

1
@SamuelClay。特定の場合に使用すると良い点です。個人的には、NSUIntegerをuintに変換します。しかしながら。問題はNSUIntegerではなくNSIntegerの変換についてでした。
Abizern 2012年

一般的な落とし穴を説明するために、私はunsigned intのみを使用しました。私の答えが示すように、それは両方に対して同じ型キャストです。それは難しい問題ではありませんが、十分に一般的であり、誰もが単一行の回答を推奨するのを見たことはありません。
Samuel Clay

0

通常、UIsegmentedControlで使用され、32ビットではなく64ビットでコンパイルすると「エラー」が表示されます。新しい変数に渡さないための簡単な方法は、このヒントを使用して(int)を追加することです。

[_monChiffre setUnite:(int)[_valUnites selectedSegmentIndex]];

の代わりに :

[_monChiffre setUnite:[_valUnites selectedSegmentIndex]];
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.