Làm thế nào để chuyển đổi An NSInteger thành int?


97

Ví dụ: khi chuyển một valuethông báo đến một NSIntegerphiên bản như vậy

[a value] nó gây ra EXC_BAD_ACCESS.

Vậy làm thế nào để chuyển đổi một NSIntegerthành int?

Nếu nó có liên quan, chỉ những số nhỏ <32 được sử dụng.


2
Bạn có vẻ khá bối rối. [a value] gợi ý rằng bạn mong đợi một đối tượng là một đối tượng, nhưng nó là NSInteger vào lúc này. "Chuyển đổi" thành một int sẽ không giải quyết được vấn đề đó.
Mike Abdullah

Câu trả lời:


205

Ta da:

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

NSIntegerkhông có gì khác hơn một 32/64 bit int. (nó sẽ sử dụng kích thước thích hợp dựa trên hệ điều hành / nền tảng bạn đang chạy)


13
Nói một cách chính xác, tôi nghĩ NSInteger là một int trên nền tảng 32 bit và lâu dài trên nền tảng 64 bit.
Frédéric Adda

5
Tôi nhận được một cảnh báo bằng cách sử dụng đề nghị "đúc": chuyển đổi ngầm mất nguyên chính xác: 'NSUInteger' (aka 'unsigned long') để 'int'
djcj

@djcj, vâng, câu trả lời không đúng đối với SDK mới. Tôi nghĩ.
Azik Abdullah

Sẽ không dễ dàng hơn nhiều nếu chỉ đặt (int) trước NSInteger? Ví dụ, (int) myInteger bất cứ khi nào bạn muốn gọi dạng số nguyên, để bạn không phải tạo một biến mới.
chandhooguy

2
@chandhooguy tại sao bạn lại cố gắng tránh một biến mới?
Dan Rosenstark

28

Nếu bạn muốn thực hiện điều này nội dòng, chỉ cần truyền NSUIntegerhoặc NSIntegerđến một 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
Chỉ vì tò mò, tại sao bạn lại đăng câu trả lời 2 năm sau sự thật cho một câu hỏi đã có câu trả lời được chấp nhận với số phiếu bầu ở hai chữ số? Đặc biệt là vì câu trả lời của bạn chỉ là diễn đạt lại câu trả lời đó.
Lily Ballard

6
Bởi vì câu trả lời của tôi là một dòng duy nhất (sử dụng kiểu ép kiểu nội tuyến - the (int)), mà tôi nghĩ đó là những gì OP có thể muốn. Tôi tự mình xem xét vấn đề này và nhận thấy tất cả các câu trả lời về chủ đề này đều có nhiều dòng.
Samuel Clay

2
Câu trả lời được chấp nhận cho thấy một chuyển đổi ngầm sử dụng một dòng. Câu trả lời của Abizern giải thích rằng một chuyển đổi ngầm định sẽ xảy ra nếu bạn cố gắng sử dụng một NSIntegergiá trị thay cho một int. Trong cả hai trường hợp, đây không phải là một giải pháp đa dòng.
Lily Ballard

25
Tôi nên rõ ràng hơn. Vì đây là một câu hỏi hơi mới làm quen nên lập trình viên mới vào nghề có thể không rõ ràng rằng họ có thể chuyển đổi nội tuyến với biểu thức (int). Các câu trả lời khác không hiển thị điều này và tôi nghĩ nó giúp ích cho bất kỳ ai tình cờ gặp trang này.
Samuel Clay

4
Và tôi tình cờ gặp trang này một năm rưỡi sau đó, cần dàn diễn viên liên quan đến NSUInteger một cách cụ thể. Cảm ơn, Samuel!
leanne

18

Tôi không chắc về các trường hợp bạn cần chuyển đổi một NSIntegerthành mộtint .

NSInteger chỉ là một typedef:

NSInteger Được sử dụng để mô tả một số nguyên độc lập với việc bạn đang xây dựng cho hệ thống 32 bit hay 64 bit.

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

Bạn có thể sử dụng NSIntegerbất kỳ nơi nào bạn sử dụng intmà không cần chuyển đổi nó.


2
Đây là một lý do chính đáng để bạn muốn chuyển đổi NSUinteger thành so sánh giá trị int:. (int i = -1)> (NSUinteger j = 14) chuyển đổi int thành unsigned, nghĩa là -1> 14, không phải là những gì bạn muốn.
Samuel Clay

1
@SamuelClay. Một điểm tốt khi sử dụng trong các trường hợp cụ thể. Cá nhân tôi muốn chuyển đổi một NSUInteger thành một uint. Tuy nhiên. Câu hỏi là về việc chuyển đổi NSInteger, không phải NSUInteger.
Abizern

Tôi chỉ sử dụng một int không dấu để minh họa một lỗi phổ biến. Đó là cùng một kiểu đúc cho cả hai, như câu trả lời của tôi đã chứng minh. Đây không phải là một vấn đề khó, nhưng nó đủ phổ biến và tôi vẫn chưa thấy ai đề xuất câu trả lời một dòng.
Samuel Clay

0

Thường được sử dụng trong UIsegmentedControl, "lỗi" xuất hiện khi biên dịch trong 64bits thay vì 32bits, cách dễ dàng để không chuyển nó sang một biến mới là sử dụng mẹo này, add (int) :

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

thay vì :

[_monChiffre setUnite:[_valUnites selectedSegmentIndex]];
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.