¿Cuál es la diferencia entre NSNumber y NSInteger?
-
18-09-2019 - |
Pregunta
¿Cuál es la diferencia entre NSNumber y NSInteger? ¿Hay más primitivas como estos que yo debería saber? ¿Hay uno para los flotadores?
Solución
Las respuestas existentes son útiles; añadiendo a ellos:
Sí, NSUInteger
da el doble de alcance entre los números enteros positivos como NSInteger
, pero creo que otra de las razones fundamentales para elegir entre los dos es simplemente para distinguir entre los casos donde los valores negativos simplemente no tienen sentido .
Ejemplo: el valor de retorno del método de NSArray
de count
es un NSUInteger
, lo cual tiene sentido ya que no podemos tener una matriz con un número negativo de elementos. Cuando el codificador sabe que es sin firmar, él / ella tiene más libertad para realizar operaciones que podrían ser poco fiables en el caso firmado, incluyendo operaciones bit a bit, tales como el cambio. este blog post habla más sobre firmó vs sin firmar.
Mi suposición acerca de CGFloat
vs NSFloat
(que no existe): Podría ser el caso de que los diseñadores de los elementos de código con nombres NeXTStep simplemente no necesitan especificar demasiados valores flotantes , fuera de los intervalos de tiempo. Por lo que dieron NSTimeInterval
, que es un tipo de punto flotante, pero que tiene la clara intención para su uso con intervalos de tiempo. Y, francamente, es muy bueno tener ese tipo porque sabes que siempre está destinado a ser en cuestión de segundos sin tener que hacer frente a una estructura. Cuando se mueve en el mundo de los gráficos (donde vive núcleo de gráficos), de repente flotadores están a su alrededor, flotando en el aire (jaja). Así que tiene sentido para introducir un CGFloat
allí. Este párrafo es todo "especulación educada."
Además, para ser claros acerca de por las que podría utilizar NSInteger
etc en lugar de tipos primitivos : Porque de esta manera es más fácil escribir código portátil que aprovecha al máximo la arquitectura de la máquina. Por ejemplo, un CGFloat
utiliza 32 bits en algunas máquinas y 64 bits en otros, dependiendo en gran medida de la cantidad de un desnivel de eficiencia hay en esas máquinas para esos tamaños. En algunos casos, no hay aumento de velocidad real para el uso de 32 bits vs 64 bits, por lo que bien podría utilizar 64 bits. Si usted ha declarado en cosas como de CGFloat
, de repente tener que precisión adicional "gratis" cuando vuelva a compilar.
Y, como iKenndac ha señalado, NSNumber
es una clase contenedora para todos de estos (y otros tipos primitivos o cuasi-primitivos como el BOOL
) que le permite incluirlo en sus NSArray
s y NSDictionary
s, archivarlos con mayor facilidad, y hacer otras cosas que pueden hacer NSObject
s.
Otros consejos
NSNumber
es una clase, no una primitiva, y se utiliza cuando se necesita para poner números en bruto en diccionarios, matrices, o de otra manera encapsular ellos. NSInteger
, NSUInteger
, CGFloat
, etc, son tipos simples y corresponden (en sistemas de 32 bt como el iPhone) para int
, unsigned int
y float
.
Como regla general, si necesita almacenar un número en algún lugar, utilizar NSNumber
. Si estás haciendo cálculos, bucles, etc., el uso NSInteger
, NSUInteger
o CGFloat
.
Puede envolver un NSInteger
en un NSNumber
:
NSNumber *aNumber = [NSNumber numberWithInteger:21];
... y recuperarlo:
NSInteger anInteger = [aNumber integerValue];
Puede encontrar más información aquí: http://iosdevelopertips.com/cocoa /nsnumber-and-nsinteger.html
NSInteger es igual que un int
tradicional en C. Es un typedef. Hay otros como NSUInteger
, CGFloat
, etc., que todos son sinónimos de los tipos primitivos.
NSNumber es útil cuando se necesita para pegar un número en un NSArray o NSDictionary. La práctica habitual es utilizar estas colecciones frente a rodar su propia; el inconveniente es que sólo pueden contener objetos Objective-C.
NSNumber envuelve esencialmente un int
(o flotador, etc) en un objeto Obj-C (similar al concepto C # / de Java de 'boxeo' un tipo primitivo) que se puede añadir a una matriz:
NSArray * myArray = [[NSArray alloc] init];
[myArray addObject:3]; // invalid, will not compile.
[myArray [NSNumber numberWithInt:3]]; // ok
Por motivos de rendimiento, si se puede, utilizar tipos primitivos (como int, float, int []). Sin embargo, a veces no se puede evitar NSArray / NSNumber, como cuando se está leyendo o escribiendo entradas en un archivo .plist
.
NSNumber se utiliza generalmente para almacenar variables, NSUInteger se utiliza para la aritmética
se puede cambiar un NSNumber a un NSUInteger al hacer esto:
NSNumber *variable = @1;
NSUInteger variableInt = [variable unsignedIntegerValue];
Se ha dicho antes, pero como regla general, las variables que necesitan ser definidos con * son clases de Objective C, mientras que las variables que no necesitan un * son C primitivas.
Según lo dicho por otros antes, NSNumber
es una subclase NSObject
. No es un C primitiva ( como int, unsigned int, float, double, etc. ) NSInteger
, CGFloat
, NSUInteger
son simples typedefs
sobre las primitivas C.
La necesidad de NSNumber
surge de la necesidad de usar los números como parámetros a las API que requieren objetos. El ejemplo es, cuando se desea almacenar un número en un NSArray
, En los datos básicos, o en un NSDictionary
.
¿Hay más primitivas como estos que yo debería saber? Bueno, NSNumber
no es un tipo primitivo, y se envuelve alrededor de todo tipo de números (flotadores, tipos enteros, booleanos y así sucesivamente). También debe aprender sobre NSValue, que es la base para NSNumber
.
¿Hay uno para los flotadores? No hay ninguna typedef "NS" de flotador, pero NSNumber
puede envolver alrededor de cualquier número de flotación:
NSNumber *myPi = [NSNumber numberWithFloat:3.1415926];
O usted podría utilizar los CoreGraphics tipo primitivo CGFloat.