2009-11-17 21 views
83

Por ejemplo cuando se pasa un mensaje value a una instancia NSInteger como tanCómo convertir un NSInteger a un int?

[a value] causa un EXC_BAD_ACCESS.

Entonces, ¿cómo convertir un NSInteger en ?

Si es relevante, solo se usan números pequeños < 32.

+2

Pareces estar bastante confundido. [un valor] sugiere que espera que a sea un objeto, pero que es un NSInteger en este momento. "Convertir" a un int no resolverá ese problema. –

Respuesta

179

Ta da:

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

NSInteger es nada más que un int 32/64 bits. (usará el tamaño apropiado según el sistema operativo/plataforma que esté ejecutando)

+11

Para ser precisos, creo que NSInteger es una plataforma int en plataformas de 32 bits, y una plataforma larga en 64 bits. –

+4

Recibo una advertencia usando el "moldeado" sugerido: la conversión implícita pierde precisión entera: 'NSUInteger' (también conocido como 'unsigned long') a 'int' – djcj

+0

@djcj, sí, la respuesta no es correcta para los nuevos SDK. Creo. – NAZIK

17

No estoy seguro de las circunstancias en las que debe convertir un NSInteger en un .

NSInteger es sólo un typedef:

NSInteger Se utiliza para describir un número entero independientemente de si usted está construyendo una de 32 bits o un sistema de 64 bits.

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

Puede utilizar NSInteger cualquier lugar se utiliza un int sin convertirlo.

+2

He aquí una buena razón para querer convertir un NSUinteger a una int: comparaciones de valores. (int i = -1)> (NSUinteger j = 14) convierte el int en unsigned, significando -1> 14, que no es lo que desea. –

+1

@SamuelClay. Un buen punto cuando se usa en casos específicos. Personalmente, convertiría un NSUInteger en un error. Sin embargo. La pregunta era sobre convertir NSInteger, no NSUInteger. – Abizern

+0

Solo usé una int sin firmar para ilustrar un error común. Es el mismo tipo de elenco para ambos, como lo demuestra mi respuesta.No es un problema difícil, pero es bastante común y todavía no he visto a nadie recomendar una respuesta de una sola línea. –

28

Si usted quiere hacer esto en línea, simplemente tire la NSUInteger o NSInteger a un 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

Solo por curiosidad, ¿por qué publica una respuesta 2 años después del hecho sobre una pregunta que ya tiene una respuesta aceptada con votos de dos dígitos? Especialmente porque el tuyo es solo una reformulación de esa respuesta. –

+6

Porque mi respuesta es una sola línea (utilizando un molde de tipo en línea - el (int)), que creo que es lo que el OP podría querer. Lo investigué yo mismo y noté que todas las respuestas sobre el tema eran multilínea. –

+2

La respuesta aceptada muestra una conversión implícita utilizando una sola línea. La respuesta de Abizern explica que ocurrirá una conversión implícita si intenta utilizar un valor 'NSInteger' en lugar de' int'. En ninguno de los casos es una solución de múltiples líneas. –

0

uso general en UIsegmentedControl, "error" aparece cuando la compilación de 64 bits en lugar de 32 bits, de manera fácil por no pasarlo a una nueva variable es utilizar estos consejos, añadir (int):

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

en lugar de:

[_monChiffre setUnite:[_valUnites selectedSegmentIndex]];