61 votes

Quelle est la différence entre NSNumber et NSInteger?

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?

59voto

iKenndac Points 14855

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

52voto

Tyler Points 16516

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' NSArrays' 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 CGFloats', 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 NSArrays et NSDictionarys, de les archiver plus facilement, et de faire d'autres choses qu' NSObjects peut faire.

6voto

Jason Points 11332

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.

2voto

eden Points 304

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.

0voto

Motti Shneor Points 703

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X