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

Odpowiedzi:


192

Zajrzyj do dokumentacji . Użyj intValuemetody:

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

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

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



Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.