แปลง NSNumber เป็น int ใน Objective-C


122

ฉันใช้[NSNumber numberWithInt:42]หรือ@(42)เพื่อแปลง int เป็น NSNumber ก่อนที่จะเพิ่มลงใน NSDictionary:

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

เมื่อฉันดึงค่าจาก NSDictionary ฉันจะแปลงค่าจาก NSNumber กลับเป็น int ได้อย่างไร

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

มันมีข้อยกเว้นว่าต้องมีการแคสต์เมื่อฉันทำแบบนี้:

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

คำตอบ:


192

มีลักษณะที่เป็นเอกสาร ใช้intValueวิธีการ:

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

ตอนนี้การแปลงโดยนัยไม่ได้รับอนุญาตกับ ARC
Alexander

โดยทั่วไป[key intValue](key is NSNumber)
user924

61

คุณควรยึดติดกับNSIntegerประเภทข้อมูลเมื่อเป็นไปได้ คุณจะต้องสร้างตัวเลขแบบนั้น:

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

การถอดรหัสใช้งานได้กับintegerValueวิธีการแล้ว:

NSInteger value = [number integerValue];

ทำไมเขาต้องยึดติดกับNSInteger?
Iulian Onofrei

1
intเป็นแบบดั้งเดิมด้วยใช่ อย่างไรก็ตามจำนวนสูงสุดที่อนุญาตนั้นกำหนดไว้อย่างแม่นยำน้อยกว่า NSIntegerโดยพื้นฐานแล้วเป็นเพียงนามแฝงของประเภทจำนวนเต็มดั้งเดิมที่รู้จักกันว่าเป็น 32 บิตในเครื่อง 32 บิตและ 64 บิตบนอุปกรณ์ 64 บิต
Max Seelemann

1
ใช่ Apple แนะนำให้
Max Seelemann

1
ฉันขอแนะนำว่าอย่าคาดเดาอะไรเกี่ยวกับเลขคณิตจำนวนดั้งเดิม คุณสามารถใช้งานได้อย่างแน่นอนintแต่มีจุดเล็ก ๆ น้อย ๆ ในการทำเช่นนั้นยกเว้นการเชื่อมต่อกับ libs ข้ามแพลตฟอร์ม และถึงแม้สิ่งที่ต้องการuint32_tจะดีกว่าที่จะใช้
Max Seelemann

1
การทำเช่นนั้นจะทำให้สอดคล้องกับมาตรฐานการเข้ารหัสแพลตฟอร์มมากขึ้นอย่างแน่นอน
Max Seelemann



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.