Як перетворити NSInteger в Int?


97

Наприклад, при передачі valueповідомлення NSIntegerподібному екземпляру

[a value] це викликає EXC_BAD_ACCESS.

Тож як перетворити NSIntegerна int?

Якщо це доречно, використовуються лише невеликі числа <32.


2
Ви, здається, досить розгублені. [Значення] говорить про те, що ви очікуєте, що a буде об'єктом, але його NSI-числом на даний момент. "Перетворення" на int не вирішить цю проблему.
Майк Абдулла

Відповіді:


205

Та да:

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

NSIntegerє не що інше, як 32/64 біт int. (він використовуватиме відповідний розмір залежно від того, яку ОС / платформу ви використовуєте)


13
Якщо бути точним, я думаю, що NSInteger є цілим на 32-бітних платформах, а довгих на 64-бітних платформах.
Фредерік Адда

5
Я отримую попередження за допомогою запропонованого "кастингу": Неявне перетворення втрачає цілісну точність: "NSUInteger" (він же "довгий без підпису") до "int"
djcj

@djcj, так, для нових SDK відповідь не вірна. Я думаю.
Азік Абдулла

Не було б набагато простіше просто поставити (int) перед NSInteger? Наприклад, (int) myInteger кожного разу, коли ви хочете викликати цілу форму, щоб вам не довелося створювати нову змінну.
chandhooguy

2
@chandhooguy Чому ти намагаєшся уникати нової змінної?
Дан Розенстарк

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 роки після факту на питання, яке вже має прийняту відповідь з голосами в двозначних цифрах? Тим більше, що ваша лише перефразовування цієї відповіді.
Лілі Баллард

6
Оскільки моя відповідь - це один рядок (використовуючи вкладений тип передачі - (int)), який, на мою думку, може хотіти ОП. Я сам переглянув це і помітив, що всі відповіді на цю тему були багаторядковими.
Самуель Клей

2
Прийнята відповідь демонструє неявну конверсію за допомогою одного рядка. Відповідь Abizern пояснює, що неявна конверсія відбудеться, якщо ви спробуєте використати NSIntegerзначення замість int. В жодному випадку це багатолінійне рішення.
Лілі Баллард

25
Я повинен був бути зрозумілішим. Оскільки це дещо початкове питання, програмісту-початківцю може бути не очевидно, що вони можуть перетворити inline з (int) виразом. Інші відповіді цього не показують, і я думаю, що це допомагає тому, хто натрапить на цю сторінку.
Семюель Клей

4
І я натрапив на цю сторінку ще півтора року, потребуючи спеціальної ролі NSUInteger . Спасибі, Самуеле!
leanne

18

Я не впевнений в обставинах, коли вам потрібно перетворити NSIntegerна int.

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 в непідписаний, тобто -1> 14, що не є тим, що потрібно.
Самуель Клей

1
@SamuelClay. Хороший момент при використанні в конкретних випадках. Особисто я перетворив би NSUInteger на мазь. Однак. Питання полягало в перетворенні NSInteger, а не NSUInteger.
Абізерн

Я використовував лише неподписаний int, щоб проілюструвати загальну проблему. Це однотипний ролик для обох, як демонструє моя відповідь. Це не складна проблема, але вона досить поширена, і я ще не бачив, щоб хтось рекомендував однорядну відповідь.
Семюель Клей

0

Зазвичай в UIsegmentedControl "помилка" з'являється при компіляції в 64 біт замість 32 біт, простий спосіб не передати її новій змінній - використовувати ці поради, додати (int) :

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

замість :

[_monChiffre setUnite:[_valUnites selectedSegmentIndex]];
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.