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"];

Jawaban:


192

Lihat dokumentasi . Gunakan intValuemetode:

NSNumber *number = [dict objectForKey:@"integer"];
int intValue = [number intValue];

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];

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



Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.