Ubah NSNumber menjadi int di Objective-C

122

Saya menggunakan [NSNumber numberWithInt:42]atau @(42)mengonversi int ke NSNumber sebelum menambahkannya ke NSDictionary:

int intValue = 42;
NSNumber *numberValue = [NSNumber numberWithInt:intValue];
NSDictionary *dict = @{ @"integer" : numberValue };

Ketika saya mengambil nilai dari NSDictionary, bagaimana cara mengubahnya dari NSNumber kembali ke int?

NSNumber *number = dict[@"integer"];
int *intNumber = // ...?

Itu melempar pengecualian yang mengatakan casting diperlukan ketika saya melakukannya dengan cara ini:

int number = (int)dict[@"integer"];
suse
sumber

Jawaban:

192

Lihat dokumentasi . Gunakan intValuemetode:

NSNumber *number = [dict objectForKey:@"integer"];
int intValue = [number intValue];
Felix Kling
sumber
Konversi implisit sekarang tidak diizinkan dengan ARC.
Alexander
pada dasarnya [key intValue](kuncinya adalah NSNumber)
user924
61

Anda harus tetap menggunakan NSIntegertipe data jika memungkinkan. Jadi Anda akan membuat angka seperti itu:

NSInteger myValue = 1;
NSNumber *number = [NSNumber numberWithInteger: myValue];

Decoding bekerja dengan integerValuemetode kemudian:

NSInteger value = [number integerValue];
Max Seelemann
sumber
Mengapa dia harus tetap berpegang pada NSInteger?
Iulian Onofrei
1
intjuga primitif, ya. Namun, jumlah maksimum yang diizinkan kurang ditentukan dengan tepat. NSIntegerpada dasarnya hanyalah sebuah alias untuk beberapa tipe integer primitif yang diketahui 32bit pada mesin 32bit dan 64bit pada perangkat 64bit.
Max Seelemann
1
Ya, Apple menyarankan.
Max Seelemann
1
Saya akan merekomendasikan untuk tidak menebak-nebak apa pun tentang aritmatika bilangan asli. Anda pasti dapat menggunakannya int, tetapi tidak ada gunanya melakukannya, kecuali untuk berinteraksi dengan lib lintas platform. Dan bahkan kemudian sesuatu seperti uint32_takan lebih baik untuk digunakan.
Max Seelemann
1
Melakukan itu tentu akan membuatnya lebih konsisten dengan standar pengkodean platform, ya.
Max Seelemann
1

Pendekatan yang kurang bertele-tele:

int number = [dict[@"integer"] intValue];
baskInEminence
sumber
0

Satu baris teruji:

int number = ((NSNumber*)[dict objectForKey:@"integer"]).intValue;
Giorgio Barchiesi
sumber