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?

Était-ce utile?

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 NSArrays et NSDictionarys, les archiver plus facilement, et faire d'autres choses qui peuvent faire NSObjects.

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top