Konwertuj NSNumber na int w Objective-C

122

Używam [NSNumber numberWithInt:42]lub @(42)do konwersji int na NSNumber przed dodaniem go do NSDictionary:

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

Kiedy pobieram wartość z NSDictionary, jak mogę przekształcić ją z NSNumber z powrotem do int?

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

Zgłasza wyjątek mówiący, że rzutowanie jest wymagane, gdy robię to w ten sposób:

int number = (int)dict[@"integer"];
suse
źródło

Odpowiedzi:

192

Zajrzyj do dokumentacji . Użyj intValuemetody:

NSNumber *number = [dict objectForKey:@"integer"];
int intValue = [number intValue];
Felix Kling
źródło
Niejawna konwersja jest teraz niedozwolona w przypadku ARC.
Alexander,
w zasadzie [key intValue](klucz to NSNumber)
user924
61

W miarę możliwości należy trzymać się NSIntegertypów danych. Więc utworzyłbyś taki numer:

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

Dekodowanie działa z integerValuemetodą:

NSInteger value = [number integerValue];
Max Seelemann
źródło
Dlaczego miałby się trzymać NSInteger?
Iulian Onofrei
1
intjest też prymitywny, tak. Jednak maksymalna dozwolona liczba jest mniej precyzyjnie określona. NSIntegerjest po prostu aliasem do jakiegoś prymitywnego typu liczby całkowitej, o którym wiadomo, że jest 32-bitowy na komputerach 32-bitowych i 64-bitowy na urządzeniach 64-bitowych.
Max Seelemann
1
Tak, sugeruje Apple.
Max Seelemann
1
Nie radziłbym niczego szacować na temat arytmetyki liczb rodzimych. Możesz z pewnością użyć int, ale nie ma to większego sensu, z wyjątkiem interfejsu z bibliotekami wieloplatformowymi. I nawet wtedy coś takiego uint32_tbyłoby lepsze w użyciu.
Max Seelemann
1
Z pewnością uczyniłoby to bardziej spójnym ze standardami kodowania platform, tak.
Max Seelemann
1

Mniej rozwlekłe podejście:

int number = [dict[@"integer"] intValue];
baskInEminence
źródło
0

Przetestowany one-liner:

int number = ((NSNumber*)[dict objectForKey:@"integer"]).intValue;
Giorgio Barchiesi
źródło