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

97

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

[a value] это вызывает EXC_BAD_ACCESS.

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

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

Джеффри
источник
2
Вы, кажется, запутались. [значение] предполагает, что вы ожидаете, что a будет объектом, но в данный момент это NSInteger. «Преобразование» в int не решит этой проблемы.
Майк Абдулла

Ответы:

205

Та да:

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

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

Дэйв Делонг
источник
13
Чтобы быть точным, я думаю, что NSInteger - это int на 32-битных платформах и long на 64-битных платформах.
Frédéric Adda
5
Я получаю предупреждение, используя предложенное «приведение»: неявное преобразование теряет целочисленную точность: 'NSUInteger' (также известное как 'unsigned long') в '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)), что, как я думаю, может понадобиться OP. Я сам изучил это и заметил, что все ответы на эту тему были многострочными.
Samuel Clay
2
Принятый ответ демонстрирует неявное преобразование с использованием одной строки. Ответ Abizern объясняет, что неявное преобразование произойдет, если вы попытаетесь использовать NSIntegerзначение вместо int. Ни в том, ни в другом случае это не многострочное решение.
Лили Баллард
25
Я должен был быть яснее. Поскольку это отчасти вопрос новичка, для начинающего программиста может быть не очевидно, что они могут преобразовывать встроенные выражения с помощью выражения (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без его преобразования.

Abizern
источник
2
Вот хорошая причина преобразовать NSUinteger в сравнение значений типа int: value. (int i = -1)> (NSUinteger j = 14) преобразует int в беззнаковое, что означает -1> 14, что вам не нужно.
Samuel Clay
1
@ SamuelClay. Хороший момент при использовании в конкретных случаях. Лично я бы преобразовал NSUInteger в uint. Тем не мение. Вопрос был в преобразовании NSInteger, а не NSUInteger.
Абизерн
Я использовал беззнаковое int только для иллюстрации распространенной ошибки. Как показывает мой ответ, это приведение одного и того же типа для обоих. Это не сложная проблема, но она достаточно распространена, и я еще не видел, чтобы кто-нибудь рекомендовал однострочный ответ.
Сэмюэл Клей
0

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

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

вместо того :

[_monChiffre setUnite:[_valUnites selectedSegmentIndex]];
грохот
источник