วิธีการแปลง NSInteger เป็น int?


98

ตัวอย่างเช่นเมื่อส่งvalueข้อความไปยังNSIntegerอินสแตนซ์เช่นนั้น

[a value] มันทำให้เกิด EXC_BAD_ACCESS

ดังนั้นวิธีการแปลงNSIntegerไปint?

หากเกี่ยวข้องจะใช้เพียงตัวเลขเล็ก ๆ <32


2
ดูเหมือนคุณจะค่อนข้างสับสน [a value] แสดงให้เห็นว่าคุณคาดว่าจะเป็นวัตถุ แต่เป็น NSInteger ในขณะนี้ "การแปลง" เป็น int จะไม่สามารถแก้ปัญหานั้นได้
Mike Abdullah

คำตอบ:


207

ตาดา:

NSInteger myInteger = 42;
int myInt = (int) myInteger;

NSIntegerไม่มีอะไรมากไปกว่า int 32/64 บิต (จะใช้ขนาดที่เหมาะสมตามระบบปฏิบัติการ / แพลตฟอร์มที่คุณใช้งานอยู่)


13
เพื่อความแม่นยำฉันคิดว่า NSInteger เป็น int บนแพลตฟอร์ม 32 บิตและยาวบนแพลตฟอร์ม 64 บิต
Frédéric Adda

5
ฉันได้รับคำเตือนโดยใช้ "การส่ง" ที่แนะนำ: การแปลงโดยนัยสูญเสียความแม่นยำจำนวนเต็ม: 'NSUInteger' (aka 'unsigned long') ถึง 'int'
djcj

@djcj ใช่คำตอบไม่ถูกต้องสำหรับ SDK ใหม่ ฉันคิด.
Nazik

การใส่ (int) ไว้หน้า NSInteger จะไม่ง่ายไปกว่านี้หรือ? ตัวอย่างเช่น (int) myInteger เมื่อใดก็ตามที่คุณต้องการเรียกฟอร์มจำนวนเต็มเพื่อที่คุณจะได้ไม่ต้องสร้างตัวแปรใหม่
chandhooguy

2
@chandhooguy ทำไมคุณถึงพยายามหลีกเลี่ยงตัวแปรใหม่
Dan Rosenstark

28

หากคุณต้องการทำสิ่งนี้ในบรรทัดเพียงแค่ส่งNSUIntegerหรือNSIntegerไปที่int:

int i = -1;
NSUInteger row = 100;
i > row // true, since the signed int is implicitly converted to an unsigned int
i > (int)row // false

1
ด้วยความอยากรู้อยากเห็นทำไมคุณถึงโพสต์คำตอบ 2 ปีหลังจากที่คำถามที่มีคำตอบที่ยอมรับแล้วพร้อมคะแนนโหวตเป็นเลขสองหลัก โดยเฉพาะอย่างยิ่งเนื่องจากคุณเป็นเพียงการนำคำตอบนั้นมาใช้ใหม่
Lily Ballard

6
เนื่องจากคำตอบของฉันคือบรรทัดเดียว (ใช้การร่ายแบบอินไลน์ - the (int)) ซึ่งฉันคิดว่าเป็นสิ่งที่ OP อาจต้องการ ฉันตรวจสอบสิ่งนี้ด้วยตัวเองและสังเกตว่าคำตอบทั้งหมดในหัวข้อนี้มีหลายบรรทัด
Samuel Clay

2
คำตอบที่ยอมรับแสดงให้เห็นถึงการแปลงโดยนัยโดยใช้บรรทัดเดียว คำตอบของ Abizern อธิบายว่าการแปลงโดยปริยายจะเกิดขึ้นหากคุณพยายามใช้NSIntegerค่าแทนint. ไม่ว่าในกรณีใดจะเป็นโซลูชันแบบหลายบรรทัด
Lily Ballard

25
ฉันควรจะชัดเจนกว่านี้ เนื่องจากนี่เป็นคำถามมือใหม่จึงอาจไม่ชัดเจนสำหรับโปรแกรมเมอร์มือใหม่ที่สามารถแปลงอินไลน์ด้วยนิพจน์ (int) ได้ คำตอบอื่น ๆ ไม่แสดงสิ่งนี้และฉันคิดว่ามันช่วยให้ทุกคนที่สะดุดในหน้านี้
Samuel Clay

4
และฉันก็พบกับหน้านี้ในอีกหนึ่งปีครึ่งต่อมาโดยต้องการนักแสดงที่เกี่ยวข้องกับNSUIntegerโดยเฉพาะ ขอบคุณซามูเอล!
ลีแอนน์

18

ผมไม่แน่ใจว่าเกี่ยวกับสถานการณ์ที่คุณจำเป็นต้องแปลงไปยังNSIntegerint

NSInteger เป็นเพียง typedef:

NSInteger ใช้เพื่ออธิบายจำนวนเต็มโดยไม่ขึ้นกับว่าคุณกำลังสร้างสำหรับระบบ 32 บิตหรือ 64 บิต

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 
typedef long NSInteger;
#else
typedef int NSInteger;
#endif

คุณสามารถใช้NSIntegerสถานที่ใดก็ได้ที่คุณใช้intโดยไม่ต้องแปลง


2
นี่เป็นเหตุผลที่ดีที่คุณต้องการแปลง NSUinteger เป็นการเปรียบเทียบ int: value (int i = -1)> (NSUinteger j = 14) แปลง int เป็น unsigned หมายถึง -1> 14 ซึ่งไม่ใช่สิ่งที่คุณต้องการ
Samuel Clay

1
@SamuelClay. จุดที่ดีเมื่อใช้ในบางกรณี ส่วนตัวฉันจะแปลง NSUInteger เป็น uint อย่างไรก็ตาม คำถามเกี่ยวกับการแปลง NSInteger ไม่ใช่ NSUInteger
Abizern

ฉันใช้เพียง int ที่ไม่ได้ลงนามเพื่อแสดงข้อผิดพลาดทั่วไป มันเป็นประเภทเดียวกันสำหรับทั้งสองอย่างตามที่ฉันแสดงคำตอบ ไม่ใช่ปัญหาที่ยาก แต่ก็เป็นเรื่องธรรมดาและฉันยังไม่เห็นใครแนะนำคำตอบแบบบรรทัดเดียว
Samuel Clay

0

ที่ใช้กันทั่วไปใน UIsegmentedControl "error" จะปรากฏขึ้นเมื่อคอมไพล์เป็น 64bits แทนที่จะเป็น 32bits วิธีง่ายๆในการไม่ส่งต่อไปยังตัวแปรใหม่คือการใช้เคล็ดลับนี้เพิ่ม(int) :

[_monChiffre setUnite:(int)[_valUnites selectedSegmentIndex]];

แทน :

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