Come convertire un NSInteger in un int?


97

Ad esempio, quando si passa un valuemessaggio a NSIntegerun'istanza in questo modo

[a value] provoca un EXC_BAD_ACCESS.

Quindi come convertire un NSIntegerin int?

Se è rilevante, vengono utilizzati solo numeri piccoli <32.


2
Sembri piuttosto confuso. [un valore] suggerisce che ti aspetti che a sia un oggetto, ma che al momento è un NSInteger. La "conversione" in un int non risolverà il problema.
— Mike Abdullah

Risposte:


205

Ta da:

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

NSIntegernon è altro che un int a 32/64 bit. (utilizzerà la dimensione appropriata in base al sistema operativo / piattaforma in esecuzione)


13
Per essere precisi, penso che NSInteger sia un int su piattaforme a 32 bit e un long su piattaforme a 64 bit.
— Frédéric Adda

5
Ricevo un avviso utilizzando il "casting" suggerito: la conversione implicita perde la precisione intera: "NSUInteger" (noto anche come "unsigned long") a "int"
— djcj

@djcj, sì, la risposta non è corretta per i nuovi SDK. Penso.
— Azik Abdullah,

Non sarebbe molto più semplice mettere (int) davanti a NSInteger? Ad esempio, (int) myInteger ogni volta che si desidera chiamare il formato intero, in modo da non dover creare una nuova variabile.
— chandhooguy

2
@chandhooguy perché stai cercando di evitare una nuova variabile?
— Dan Rosenstark

28

Se vuoi farlo in linea, trasmetti semplicemente NSUIntegero NSIntegera 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 per curiosità, perché stai postando una risposta 2 anni dopo il fatto su una domanda che ha già una risposta accettata con voti in doppia cifra? Soprattutto perché la tua è solo una riformulazione di quella risposta.
— Lily Ballard

6
Perché la mia risposta è una singola riga (usando un cast di tipo inline - il (int)), che penso sia ciò che l'OP potrebbe desiderare. Ho esaminato personalmente questo aspetto e ho notato che tutte le risposte sull'argomento erano su più righe.
— Samuel Clay

2
La risposta accettata dimostra una conversione implicita utilizzando una singola riga. La risposta di Abizern spiega che si verificherà una conversione implicita se provi a utilizzare un NSIntegervalore al posto di un int. In nessuno dei due casi si tratta di una soluzione multilinea.
— Lily Ballard

25
Avrei dovuto essere più chiaro. Poiché questa è una domanda un po 'per principianti, potrebbe non essere ovvio per il programmatore inesperto che può convertire in linea con un'espressione (int). Le altre risposte non lo mostrano e penso che aiuti chiunque inciampi su questa pagina.
— Samuel Clay

4
E mi sono imbattuto in questa pagina ancora un anno e mezzo dopo, avendo bisogno specificamente del cast relativo a NSUInteger . Grazie, Samuel!
— leanne

18

Non sono sicuro delle circostanze in cui è necessario convertire un NSIntegerin un file int.

NSInteger è solo un typedef:

NSInteger Utilizzato per descrivere un numero intero indipendentemente dal fatto che si stia creando per un sistema a 32 bit o 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

Puoi utilizzare NSIntegerqualsiasi luogo in cui utilizzi un intsenza convertirlo.


2
Ecco un buon motivo per convertire un NSUinteger in un int: confronti di valori. (int i = -1)> (NSUinteger j = 14) converte int in unsigned, che significa -1> 14, che non è quello che vuoi.
— Samuel Clay

1
@SamuelClay. Un buon punto se usato in casi specifici. Personalmente, convertirò un NSUInteger in un uint. Però. La domanda riguardava la conversione di NSInteger, non NSUInteger.
— Abizern

Ho usato solo un int non firmato per illustrare una trappola comune. È lo stesso tipo di cast per entrambi, come dimostra la mia risposta. Non è un problema difficile, ma è abbastanza comune e non ho ancora visto nessuno consigliare una risposta di una riga.
— Samuel Clay il

0

Comunemente utilizzato in UIsegmentedControl, viene visualizzato "errore" durante la compilazione a 64 bit invece che a 32 bit, un modo semplice per non passarlo a una nuova variabile è utilizzare questi suggerimenti, aggiungere (int) :

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

invece di :

[_monChiffre setUnite:[_valUnites selectedSegmentIndex]];
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.