NSNumber'ı Objective-C'de int'e dönüştürün


122

Bir int'i NSDictionary eklemeden önce NSNumber'a dönüştürmek için [NSNumber numberWithInt:42]veya kullanıyorum @(42):

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

Değeri NSDictionary'den aldığımda, onu NSNumber'dan int'e nasıl dönüştürebilirim?

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

Bu şekilde yaptığımda, dökümün gerekli olduğunu söyleyen bir istisna atıyor:

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

Yanıtlar:


192

Belgelere bir göz atın . intValueYöntemi kullanın :

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

Artık ARC ile örtük dönüşüme izin verilmiyor.
İskender

temelde [key intValue](anahtar NSNumber)
kullanıcı924

61

NSIntegerMümkün olduğunda veri türlerine bağlı kalmalısınız . Yani sayıyı şöyle yaratırsınız:

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

Kod çözme şu integerValueyöntemle çalışır :

NSInteger value = [number integerValue];

Neden sadık kalsın NSInteger?
Iulian Onofrei

1
intaynı zamanda ilkel, evet. Bununla birlikte, izin verilen maksimum sayı daha az kesin olarak tanımlanmıştır. NSIntegeraslında 32bit makinelerde 32bit ve 64bit cihazlarda 64bit olduğu bilinen bazı ilkel tamsayı türünün bir takma adıdır.
Max Seelemann

1
Evet, Apple öneriyor.
Max Seelemann

1
Yerel sayı aritmetiği hakkında hiçbir şey tahmin etmemenizi tavsiye ederim. Kullanabileceğinizden emin olabilirsiniz int, ancak platformlar arası kitaplıklar ile arayüz oluşturmak dışında bunu yapmanın pek bir anlamı yoktur. Ve o zaman bile uint32_tbunun gibi bir şey kullanmak daha iyi olurdu.
Max Seelemann

1
Bunu yapmak kesinlikle onu platform kodlama standartlarıyla daha tutarlı hale getirir, evet.
Max Seelemann



0

Test edilmiş bir tek astar:

int number = ((NSNumber*)[dict objectForKey:@"integer"]).intValue;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.