Quelle est la différence entre NSNumber et NSInteger? Il n'y a plus primitives comme celles-ci que je devrais connaître/utiliser? Est-il l'un de flotteurs?
Réponses
Trop de publicités?NSNumber
est une classe, pas un primitif, et est utilisée lorsque vous avez besoin de mettre des chiffres bruts dans les dictionnaires, tableaux, ou autrement encapsuler. NSInteger
, NSUInteger
, CGFloat
, etc sont des types simples et correspondent (sur 32-bt systèmes comme l'iPhone) int
, unsigned int
et float
.
En règle générale, si vous avez besoin de stocker un nombre quelque part, utiliser NSNumber
. Si vous êtes en train de faire des calculs, des boucles, etc, utilisez NSInteger
, NSUInteger
ou CGFloat
.
Vous pouvez envelopper un NSInteger
en NSNumber
:
NSNumber *aNumber = [NSNumber numberWithInteger:21];
... et le faire revenir:
NSInteger anInteger = [aNumber integerValue];
Vous pouvez trouver plus d'info ici: http://iphonedevelopertips.com/cocoa/nsnumber-and-nsinteger.html
Les questions / réponses sont utiles; en y ajoutant:
Oui, NSUInteger
donne deux fois la gamme parmi les entiers positifs comme NSInteger
, mais je pense qu'un autre de la raison critique à choisir entre les deux est tout simplement de faire la distinction entre les cas où les valeurs négatives simplement ne font pas sens.
Exemple: la valeur de retour de l' NSArray
s' count
méthode est une méthode NSUInteger
, ce qui est logique, puisque nous ne pouvons pas avoir un tableau avec un nombre négatif des éléments. Lorsque le programmeur sait que c'est pas signé, il/elle a plus de liberté pour effectuer des opérations qui pourraient être peu fiables dans la signature de l'affaire, y compris les opérations bit à bit comme l'évolution. Ce blog parle plus à propos signé / non signé.
Ma supposition sur CGFloat
vs NSFloat
(qui n'existe pas): Cela pourrait être le cas que les concepteurs de la NeXTStep-nommé d'éléments de code n'a tout simplement pas besoin de spécifier trop grand nombre de valeurs flottantes, à l'extérieur des intervalles de temps. Ils ont donc NSTimeInterval
, ce qui est une variable de type point, mais qui est clairement conçu pour être utilisé avec des intervalles de temps. Et, franchement, c'est génial d'avoir ce type parce que vous savez qu'il est toujours censé être en quelques secondes sans avoir à traiter avec un struct. Lorsque vous vous déplacez dans le graphique du monde (où les Graphiques de Base vie), du coup les flotteurs sont tout autour de vous, planant dans l'air (haha). Il est donc logique d'introduire un CGFloat
. Ce paragraphe est tous les "instruits de la spéculation."
Aussi, juste pour être clair sur pourquoi vous pouvez utiliser NSInteger
etc au lieu de types primitifs: Car de 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 certaines machines et 64 bits sur les autres, dépendant en grande partie sur la façon dont beaucoup d'un écart de rendement, il y a sur ces machines pour ces tailles. Dans certains cas, il n'y a pas de véritable accélération de l'utilisation de 32 bits vs 64 bits, de sorte que vous pourriez aussi bien utiliser 64 bits. Si vous avez déclaré des choses comme CGFloat
s', soudain, vous obtenez supplémentaire de précision "gratuitement" lorsque vous recompiler.
Et, comme iKenndac l'a souligné, NSNumber
est une classe wrapper pour l'ensemble de ces (et d'autres primitives ou quasi-types primitifs comme l' BOOL
) ce qui vous permet de l'inclure dans votre NSArray
s et NSDictionary
s, de les archiver plus facilement, et de faire d'autres choses qu' NSObject
s peut faire.
NSInteger est juste comme une tradition int
en C. C'est un typedef. Il existe d'autres comme NSUInteger
, CGFloat
, etc. que tous sont des synonymes pour les types primitifs.
NSNumber est utile lorsque vous avez besoin de coller un numéro dans un NSArray ou NSDictionary. La pratique courante est d'utiliser ces collections rapport à rouler votre propre; l'inconvénient est qu'elles ne peuvent contenir Objective-C objets.
NSNumber essentiellement encapsule une int
(ou float, etc) en Obj-C objet (similaire à C#/Java le concept 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 le pouvez, utiliser les types primitifs (comme int, float, int[]). Cependant, parfois, vous ne pouvez pas éviter de NSArray/NSNumber, comme lors de la lecture ou de l'écriture d'entrées en .plist
le fichier.
NSNumber est généralement utilisé pour stocker des variables, NSUInteger est utilisé pour l'arithmétique
vous pouvez modifier un NSNumber à un NSUInteger en faisant ceci:
NSNumber *variable = @1;
NSUInteger variableInt = [variable unsignedIntegerValue];
Il a été dit avant, mais comme une règle générale, les variables qui doivent être définis avec * sont les Objective C classes, alors que les variables qui n'ont pas besoin d'un * sont C primitives.
Comme dit par d'autres avant, NSNumber est une sous-classe NSObject. Ce n'est pas un C primitive (comme int, unsigned int, float, double, etc.) NSInteger, CGFloat, NSUInteger sont simples typedefs sur le C primitives.
La nécessité pour NSNumber découle de la nécessité d'utiliser des nombres en tant que paramètres d'Api qui nécessitent des Objets. Exemple est, lorsque vous souhaitez stocker un nombre dans un NSArray, Dans la Base de Données, ou dans un NSDictionary.
Il n'y a plus primitives comme celles-ci que je devrais connaître? Eh bien, NSNumber n'est pas un type primitif, et il s'enroule autour de toutes les sortes de nombres (les chars, les types intégraux, les booléens et ainsi de suite). Renseignez-vous également sur NSValue, qui est la base pour NSNumber.
Est-il l'un de flotteurs? Il n'y a pas de "NS" typedef pour flotter, mais NSNumber peuvent s'enrouler autour d'un nombre à virgule: NSNumber *myPi = [NSNumber numberWithFloat:3.1415926]; Ou vous pourriez utiliser les CoreGraphics type primitif CGFloat.