Bagaimana cara mengubah NSInteger menjadi int?

97

Misalnya saat menyampaikan valuepesan ke NSIntegerinstance seperti itu

[a value] itu menyebabkan EXC_BAD_ACCESS.

Jadi bagaimana mengkonversi NSIntegerke int?

Jika relevan hanya angka kecil <32 yang digunakan.

Jeffrey
sumber
2
Anda tampaknya agak bingung. [nilai] menyarankan Anda mengharapkan a menjadi objek, tetapi itu adalah NSInteger saat ini. "Mengubah" menjadi int tidak akan menyelesaikan masalah itu.
Mike Abdullah

Jawaban:

205

Ta da:

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

NSIntegertidak lebih dari int 32/64 bit. (ini akan menggunakan ukuran yang sesuai berdasarkan OS / platform apa yang Anda jalankan)

Dave DeLong
sumber
13
Tepatnya, saya pikir NSInteger adalah int pada platform 32-bit, dan panjang pada platform 64-bit.
Frédéric Adda
5
Saya mendapatkan peringatan menggunakan "casting" yang disarankan: Konversi implisit kehilangan presisi bilangan bulat: 'NSUInteger' (alias 'unsigned long') menjadi 'int'
djcj
@djcj, ya, jawaban untuk SDK baru salah. Kupikir.
Azik Abdullah
Bukankah lebih mudah untuk hanya meletakkan (int) di depan NSInteger? Misalnya, (int) myInteger setiap kali Anda ingin memanggil formulir integer, sehingga Anda tidak perlu membuat variabel baru.
chandhooguy
2
@chandhooguy mengapa Anda mencoba menghindari variabel baru?
Dan Rosenstark
28

Jika Anda ingin melakukan ini sebaris, cukup transmisikan NSUIntegeratau NSIntegerke 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
Samuel Clay
sumber
1
Hanya karena penasaran, mengapa Anda memposting jawaban 2 tahun setelah fakta pada pertanyaan yang sudah memiliki jawaban yang diterima dengan suara dalam dua digit? Terutama karena jawaban Anda hanyalah pengungkapan ulang dari jawaban itu.
Lily Ballard
6
Karena jawaban saya adalah satu baris (menggunakan cast tipe inline - the (int)), yang menurut saya mungkin diinginkan OP. Saya melihat ini sendiri dan melihat semua jawaban pada subjek multi-baris.
Samuel Clay
2
Jawaban yang diterima menunjukkan konversi implisit menggunakan satu baris. Jawaban Abizern menjelaskan bahwa konversi implisit akan terjadi jika Anda mencoba menggunakan NSIntegernilai sebagai pengganti int. Dalam kedua kasus ini, ini bukan solusi multi-garis.
Lily Ballard
25
Saya seharusnya lebih jelas. Karena ini adalah pertanyaan yang agak pemula, mungkin tidak jelas bagi programmer pemula bahwa mereka dapat mengonversi sebaris dengan ekspresi (int). Jawaban lain tidak menunjukkan ini dan saya pikir ini membantu siapa pun yang tersandung di halaman ini.
Samuel Clay
4
Dan saya tersandung pada halaman ini satu setengah tahun kemudian, membutuhkan pemeran terkait NSUInteger secara khusus. Terima kasih, Samuel!
leanne
18

Saya tidak yakin tentang keadaan di mana Anda perlu mengonversi NSIntegermenjadi int.

NSInteger hanyalah typedef:

NSInteger Digunakan untuk mendeskripsikan integer secara independen apakah Anda sedang membuat untuk sistem 32-bit atau 64-bit.

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

Anda dapat menggunakan NSIntegertempat mana pun yang Anda gunakan inttanpa mengubahnya.

Abizern
sumber
2
Berikut adalah alasan bagus untuk mengonversi NSUinteger menjadi perbandingan int: value. (int i = -1)> (NSUinteger j = 14) mengubah int menjadi unsigned, artinya -1> 14, yang bukan itu yang Anda inginkan.
Samuel Clay
1
@Samuel. Poin yang bagus bila digunakan dalam kasus tertentu. Secara pribadi, saya akan mengonversi NSUInteger menjadi uint. Namun. Pertanyaannya adalah tentang mengubah NSInteger, bukan NSUInteger.
Abizern
Saya hanya menggunakan int unsigned untuk mengilustrasikan kesalahan umum. Ini adalah tipe pemeran yang sama untuk keduanya, seperti yang ditunjukkan oleh jawaban saya. Ini bukan masalah yang sulit, tetapi ini cukup umum dan saya belum melihat ada orang yang merekomendasikan jawaban satu baris.
Samuel Clay
0

Biasanya digunakan di UIsegmentedControl, "error" muncul saat mengompilasi dalam 64bits, bukan 32bits, cara mudah untuk tidak meneruskannya ke variabel baru adalah dengan menggunakan tips ini, tambahkan (int) :

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

dari pada :

[_monChiffre setUnite:[_valUnites selectedSegmentIndex]];
grominet
sumber