Как преобразовать NSInteger в int?

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

[a value] вызывает ошибку EXC_BAD_ACCESS.

Итак, как преобразовать NSInteger в int?

Если это уместно, используются только маленькие числа ‹ 32.


person Jeffrey    schedule 17.11.2009    source источник
comment
Вы, кажется, довольно запутались. [значение] предполагает, что вы ожидаете, что a будет объектом, но на данный момент это NSInteger. Преобразование в int не решит эту проблему.   -  person Mike Abdullah    schedule 18.11.2009


Ответы (4)


Ta da:

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

NSInteger - это не что иное, как 32/64-битное целое число. (он будет использовать соответствующий размер в зависимости от того, какую ОС/платформу вы используете)

person Dave DeLong    schedule 17.11.2009
comment
Если быть точным, я думаю, что NSInteger — это int на 32-битных платформах и long на 64-битных платформах. - person Frédéric Adda; 12.03.2014
comment
Я получаю предупреждение, используя предложенное приведение: неявное преобразование теряет целочисленную точность: «NSUInteger» (он же «unsigned long») в «int» - person djcj; 18.09.2014
comment
@djcj, да, ответ неверен для новых SDK. Я думаю. - person Nazik; 29.11.2014
comment
Не проще ли было бы просто поставить (int) перед NSInteger? Например, (int)myInteger всякий раз, когда вы хотите вызвать целочисленную форму, так что вам не нужно создавать новую переменную. - person chandhooguy; 29.12.2014
comment
@chandhooguy, почему ты пытаешься избежать новой переменной? - person Dan Rosenstark; 07.05.2015

Если вы хотите сделать это встроенным, просто приведите 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
person Samuel Clay    schedule 03.01.2012
comment
Просто из любопытства, почему вы публикуете ответ через 2 года после факта на вопрос, на который уже есть принятый ответ с двузначным числом голосов? Тем более, что ваш ответ - это просто перефразировка этого ответа. - person Lily Ballard; 04.01.2012
comment
Потому что мой ответ представляет собой одну строку (с использованием встроенного приведения типа - (int)), что, я думаю, может понадобиться OP. Я сам изучил это и заметил, что все ответы на эту тему были многострочными. - person Samuel Clay; 05.01.2012
comment
Принятый ответ демонстрирует неявное преобразование с использованием одной строки. Ответ Абизерна объясняет, что неявное преобразование произойдет, если вы попытаетесь использовать значение NSInteger вместо int. Ни в том, ни в другом случае это не многолинейное решение. - person Lily Ballard; 05.01.2012
comment
Я должен был быть яснее. Поскольку это вопрос несколько новичков, для начинающего программиста может быть неочевидно, что они могут преобразовать встроенное выражение с помощью выражения (int). Другие ответы этого не показывают, и я думаю, что это поможет любому, кто наткнется на эту страницу. - person Samuel Clay; 17.01.2012
comment
И я наткнулся на эту страницу еще полтора года спустя, когда мне конкретно понадобился приведение, связанное с NSUInteger. Спасибо, Самуэль! - person leanne; 25.04.2014
comment
Самый популярный ответ — это одна строка: (int) myInteger — Удивительно, что нам нужны три разных типа данных для целого числа! - person John; 22.08.2018

Я не уверен в обстоятельствах, когда вам нужно преобразовать 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, не преобразовывая его.

person Abizern    schedule 18.11.2009
comment
Вот веская причина преобразовать NSUinteger в int: сравнения значений. (int i = -1) › (NSUinteger j = 14) преобразует int в unsigned, что означает -1 › 14, а это не то, что вам нужно. - person Samuel Clay; 04.01.2012
comment
@СэмюэлКлэй. Хороший момент при использовании в конкретных случаях. Лично я бы преобразовал NSUInteger в uint. Тем не мение. Вопрос был о преобразовании NSInteger, а не NSUInteger. - person Abizern; 04.01.2012
comment
Я использовал unsigned int только для того, чтобы проиллюстрировать распространенную ловушку. Как показывает мой ответ, это один и тот же тип для обоих. Это не сложная проблема, но она достаточно распространена, и я еще не видел, чтобы кто-нибудь рекомендовал однострочный ответ. - person Samuel Clay; 05.01.2012

Обычно используется в UIsegmentedControl, "ошибка" появляется при компиляции в 64-битной вместо 32-битной, простой способ не передавать ее в новую переменную - использовать эти советы, добавить (int):

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

вместо :

[_monChiffre setUnite:[_valUnites selectedSegmentIndex]];
person grominet    schedule 12.05.2014