Comment convertir un NSInteger en un int?

97

Par exemple, lors de la transmission d'un valuemessage à une NSIntegerinstance comme celle-ci

[a value] cela provoque un EXC_BAD_ACCESS.

Alors, comment convertir un NSIntegeren int?

Si c'est pertinent, seuls de petits nombres <32 sont utilisés.

Jeffrey
la source
2
Vous semblez plutôt confus. [une valeur] suggère que vous vous attendez à ce que a soit un objet, mais que c'est un NSInteger pour le moment. "Convertir" en un int ne résoudra pas ce problème.
Mike Abdullah

Réponses:

205

Ta da:

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

NSIntegern'est rien de plus qu'un int 32/64 bits. (il utilisera la taille appropriée en fonction du système d'exploitation / de la plate-forme que vous utilisez)

Dave DeLong
la source
13
Pour être précis, je pense que NSInteger est un int sur les plates-formes 32 bits, et un long sur les plates-formes 64 bits.
Frédéric Adda
5
Je reçois un avertissement en utilisant le "casting" suggéré: la conversion implicite perd la précision entière: 'NSUInteger' (aka 'unsigned long') en 'int'
djcj
@djcj, oui, la réponse n'est pas correcte pour les nouveaux SDK. Je pense.
Azik Abdullah
Ne serait-il pas beaucoup plus facile de simplement mettre (int) devant NSInteger? Par exemple, (int) myInteger chaque fois que vous souhaitez appeler la forme entière, afin que vous n'ayez pas à créer une nouvelle variable.
chandhooguy
2
@chandhooguy pourquoi essayez-vous d'éviter une nouvelle variable?
Dan Rosenstark
28

Si vous souhaitez effectuer cette opération en ligne, il vous suffit de convertir NSUIntegerou NSIntegeren 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
Samuel Clay
la source
1
Juste par curiosité, pourquoi publiez-vous une réponse 2 ans après le fait sur une question qui a déjà une réponse acceptée avec des votes à deux chiffres? D'autant plus que la vôtre n'est qu'une reformulation de cette réponse.
Lily Ballard
6
Parce que ma réponse est une seule ligne (en utilisant un cast de type en ligne - le (int)), ce que je pense est ce que l'OP pourrait vouloir. J'ai examiné cela moi-même et j'ai remarqué que toutes les réponses sur le sujet étaient multilignes.
Samuel Clay
2
La réponse acceptée montre une conversion implicite utilisant une seule ligne. La réponse d'Abizern explique qu'une conversion implicite se produira si vous essayez d'utiliser une NSIntegervaleur à la place d'un int. Dans les deux cas, il ne s'agit pas d'une solution multiligne.
Lily Ballard
25
J'aurais dû être plus clair. Puisqu'il s'agit d'une question quelque peu novice, il n'est peut-être pas évident pour le programmeur novice qu'il puisse convertir en ligne avec une expression (int). Les autres réponses ne le montrent pas et je pense que cela aide quiconque trébuche sur cette page.
Samuel Clay
4
Et je suis tombé sur cette page encore un an et demi plus tard, ayant spécifiquement besoin du casting lié à NSUInteger . Merci, Samuel!
leanne
18

Je ne sais pas sur les circonstances dans lesquelles vous avez besoin de convertir un NSIntegerà un int.

NSInteger est juste un typedef:

NSInteger Utilisé pour décrire un entier indépendamment du fait que vous construisez pour un système 32 bits ou 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

Vous pouvez utiliser NSIntegern'importe quel endroit que vous utilisez intsans le convertir.

Abizern
la source
2
Voici une bonne raison de vouloir convertir un NSUinteger en int: comparaisons de valeurs. (int i = -1)> (NSUinteger j = 14) convertit le entier en unsigned, ce qui signifie -1> 14, ce qui n'est pas ce que vous voulez.
Samuel Clay
1
@SamuelClay. Un bon point lorsqu'il est utilisé dans des cas spécifiques. Personnellement, je convertirais un NSUInteger en uint. Toutefois. La question portait sur la conversion de NSInteger, pas de NSUInteger.
Abizern le
Je n'ai utilisé qu'un int non signé pour illustrer un écueil courant. C'est le même type de casting pour les deux, comme le montre ma réponse. Ce n'est pas un problème difficile, mais c'est assez courant et je n'ai encore vu personne recommander une réponse en une seule ligne.
Samuel Clay
0

Couramment utilisé dans UIsegmentedControl, «erreur» apparaît lors de la compilation en 64 bits au lieu de 32 bits, un moyen simple de ne pas la transmettre à une nouvelle variable est d'utiliser ces astuces, ajoutez (int) :

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

au lieu de :

[_monChiffre setUnite:[_valUnites selectedSegmentIndex]];
Grominet
la source