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.