Quelle est la différence entre NSNumber et NSInteger?
-
18-09-2019 - |
Question
Quelle est la différence entre NSNumber et NSInteger? Y at-il plus primitives comme celles-ci que je devrais savoir? Y at-il un pour les flotteurs?
La solution
Les réponses existantes sont utiles; y ajoutant:
Oui, NSUInteger
donne deux fois la gamme entre les nombres entiers positifs comme NSInteger
, mais je pense qu'une autre raison critique de choisir entre les deux est tout simplement de faire la distinction entre les cas où les valeurs négatives ne font simplement pas de sens .
Exemple: la valeur de retour de la méthode de NSArray
de count
est un NSUInteger
, ce qui est logique puisque nous ne pouvons pas avoir un tableau avec un nombre négatif d'éléments. Lorsque le codeur sait qu'il est non signé, il / elle a une plus grande liberté d'effectuer des opérations qui pourraient être peu fiables dans le cas signé, y compris les opérations au niveau du bit comme le déplacement. ce blog parle plus sur signé vs non signé.
Je pense à propos de CGFloat
vs NSFloat
(qui n'existe pas): Il pourrait être le cas que les concepteurs des éléments de code NeXTstep-nommés simplement ne pas besoin de spécifier trop de valeurs flottantes , en dehors des intervalles de temps. Ils ont donc donné NSTimeInterval
, qui est un type à virgule flottante, mais qui est clairement destiné à être utilisé avec des intervalles de temps. Et, franchement, il est génial d'avoir ce type parce que vous savez qu'il est toujours censé être en quelques secondes sans avoir à faire face à une struct. Lorsque vous vous déplacez dans le monde graphique (où Core Graphics vit), flotte tout à coup sont tout autour de vous, planant dans l'air (haha). Il est donc logique d'introduire un CGFloat
là. Ce paragraphe est tout « spéculation éduquée ».
En outre, pour être clair sur pourquoi vous pouvez utiliser NSInteger
etc au lieu des types primitifs : Parce que cette façon, il est plus facile d'écrire du code portable qui tire pleinement parti de l'architecture de la machine. Par exemple, un CGFloat
utilise 32 bits sur des machines 64 bits et sur d'autres, en fonction surtout de la quantité d'un écart d'efficacité, il est sur les machines pour les tailles. Dans certains cas, il n'y a pas pour l'utilisation réelle speedup 32 bits vs 64 bits, alors vous pourriez aussi bien utiliser 64 bits. Si vous avez déclaré que les choses de ce CGFloat
, vous obtenez tout à coup que la précision supplémentaire « gratuitement » lorsque vous recompiler.
Et, comme iKenndac a souligné, NSNumber
est une classe wrapper pour tous de ces (et d'autres types primitifs ou quasi primitifs comme le BOOL
) qui vous permet d'inclure dans vos NSArray
s et NSDictionary
s, les archiver plus facilement, et faire d'autres choses qui peuvent faire NSObject
s.
Autres conseils
NSNumber
est une classe, et non une primitive, et est utilisé lorsque vous avez besoin de mettre des chiffres bruts dans les dictionnaires, les tableaux, ou de les encapsuler. NSInteger
, NSUInteger
, CGFloat
, etc sont des types simples et correspondent (sur les systèmes 32 bt comme l'iPhone) à int
, unsigned int
et float
.
En règle générale, si vous avez besoin d'enregistrer un numéro quelque part, utilisez NSNumber
. Si vous faites des calculs, des boucles, etc., l'utilisation NSInteger
, NSUInteger
ou CGFloat
.
Vous pouvez envelopper un NSInteger
dans un NSNumber
:
NSNumber *aNumber = [NSNumber numberWithInteger:21];
... et récupérer:
NSInteger anInteger = [aNumber integerValue];
Vous pouvez en savoir plus d'infos ici: http://iosdevelopertips.com/cocoa /nsnumber-and-nsinteger.html
NSInteger est comme un int
traditionnel en C. Il est un typedef. Il existe d'autres comme NSUInteger
, CGFloat
, etc. que tous sont synonymes de types primitifs.
NSNumber est utile lorsque vous devez coller un numéro dans un NSArray ou NSDictionary. La pratique courante est d'utiliser ces collections par rapport à vos propres modèles; l'inconvénient est qu'ils ne peuvent contenir que des objets en Objective-C.
NSNumber enveloppe essentiellement un int
(ou flottant, etc.) dans un objet Obj-C (similaire au concept C # / Java de 'boxe' un type primitif) qui peut être ajouté à un tableau:
NSArray * myArray = [[NSArray alloc] init];
[myArray addObject:3]; // invalid, will not compile.
[myArray [NSNumber numberWithInt:3]]; // ok
Pour des raisons de performance, si vous pouvez, utiliser des types primitifs (comme int, float, int []). Cependant, parfois vous ne pouvez pas éviter NSArray / NSNumber, par exemple lorsque vous lisez ou écrire des entrées dans un fichier .plist
.
NSNumber est généralement utilisée pour stocker des variables, NSUInteger est utilisé pour l'arithmétique
vous pouvez changer un NSNumber à un NSUInteger en faisant ceci:
NSNumber *variable = @1;
NSUInteger variableInt = [variable unsignedIntegerValue];
Il a été dit avant, mais en règle générale, les variables qui doivent être définies avec * sont objectives classes C, alors que les variables qui ne nécessitent pas un * sont primitives C.
Comme dit par d'autres avant, NSNumber
est une sous-classe NSObject
. Il n'est pas une C primitive ( comme int, unsigned int, float, double, etc. ) NSInteger
, CGFloat
, NSUInteger
sont typedefs
simples sur les primitives C.
Le besoin de NSNumber
découle de la nécessité d'utiliser des chiffres en tant que paramètres aux API qui nécessitent des objets. L'exemple est, lorsque vous souhaitez enregistrer un numéro dans un NSArray
, en Core-données, ou dans un NSDictionary
.
Y at-il plus primitives comme celles-ci que je devrais savoir? Eh bien, NSNumber
n'est pas un type primitif, et il enroule autour de toutes sortes de chiffres (flotteurs, types entiers, booléens et ainsi de suite). Vous devez aussi apprendre NSValue, qui est la base pour NSNumber
.
Y at-il un pour les flotteurs? Il n'y a pas typedef "NS" pour flotteur, mais NSNumber
peut enrouler autour de tout numéro de float:
NSNumber *myPi = [NSNumber numberWithFloat:3.1415926];
Ou vous pouvez utiliser le type primitif CoreGraphics CGFloat.