Chuyển đổi NSNumber thành int trong Objective-C


122

Tôi sử dụng [NSNumber numberWithInt:42]hoặc @(42)để chuyển đổi một int thành NSNumber trước khi thêm nó vào NSDictionary:

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

Khi tôi lấy giá trị từ NSDictionary, làm cách nào để chuyển đổi giá trị đó từ NSNumber trở lại int?

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

Nó ném ra một ngoại lệ nói rằng truyền là bắt buộc khi tôi làm theo cách này:

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

Câu trả lời:


192

Hãy xem tài liệu . Sử dụng intValuephương pháp:

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

Chuyển đổi ngầm hiện không được phép với ARC.
Alexander

cơ bản [key intValue](chính là NSNumber)
user924

61

Bạn nên sử dụng các NSIntegerloại dữ liệu khi có thể. Vì vậy, bạn sẽ tạo ra một số như vậy:

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

Giải mã hoạt động với integerValuephương pháp sau đó:

NSInteger value = [number integerValue];

Tại sao anh ta nên dính vào NSInteger?
Iulian Onofrei 19/12/14

1
intlà nguyên thủy quá, vâng. Tuy nhiên, số lượng tối đa được phép ít được xác định chính xác hơn. NSIntegervề cơ bản chỉ là một bí danh của một số kiểu số nguyên nguyên thủy được biết đến là 32bit trên máy 32bit và 64bit trên thiết bị 64bit.
Max Seelemann

1
Có, Apple đề nghị.
Max Seelemann

1
Tôi khuyên bạn không nên đoán bất cứ điều gì về số học nguyên bản. Bạn chắc chắn có thể sử dụng int, nhưng có rất ít điểm khi làm như vậy, ngoại trừ việc giao tiếp với lib đa nền tảng. Và thậm chí sau đó một cái gì đó giống như uint32_tsẽ tốt hơn để sử dụng.
Max Seelemann

1
Làm điều đó chắc chắn sẽ làm cho nó phù hợp hơn với các tiêu chuẩn mã hóa nền tảng, vâng.
Max Seelemann


1

Một cách tiếp cận ít dài dòng hơn:

int number = [dict[@"integer"] intValue];

0

Một lớp lót một lớp đã được thử nghiệm:

int number = ((NSNumber*)[dict objectForKey:@"integer"]).intValue;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.