2009-08-27 27 views
37

¿Por qué no funciona:Pasando variables NSInteger a NSMutableDictionary o NSMutableArray

NSInteger temp = 20; 
[userSettingsFromFile setObject:temp forKey:@"aTemp"]; 

pero esto:

[userSettingsFromFile setObject:@"someObject" forKey:@"aTemp"]; 

¿Cómo puedo usar la variable NSInteger?

+0

Su título es incorrecto - de acuerdo a su código de ejemplo, está utilizando una NSMutableDictionary, no un NSMutableArray. –

+0

He editado el título. De todos modos, el problema también puede surgir con NSMutableArray y con cualquier colección en general. – mouviciel

Respuesta

90

NSInteger no es un objeto - es simplemente encasillado a int de 32 bits o long de 64 bits. Como NSDictionary solo puede almacenar objetos, debe envolver el entero en un objeto antes de poder almacenarlo. Prueba esto:

NSInteger temp = 20; 
[userSettingsFromFile setObject:[NSNumber numberWithInteger:temp] 
         forKey:@"aTemp"]; 
+2

Para recuperarlo de NSDictionay, necesita usar algo como NSInteger temp = [[userSettingsFromFile objectForKey: @ "aTemp"] integerValue]; – JScarry

2

Cualquier cosa que pasa a través de setObject tiene que ser derivado de NSObject. NSInteger no es, es un int typedef simple. En su segundo ejemplo, usa NSString, que se deriva de NSObject.

5

Para almacenar números en colecciones, debe cerrarlos en una instancia NSNumber.

double aDouble = 20.3d; 
NSInteger anInt = 20; 

NSNumber *aWrappedDouble = [NSNumber numberWithDouble:aDouble]; 
NSNumber *aWrappedInt = [NSNumber numberWithInteger:anInt]; 

NSArray *anArray = [NSArray arrayWithObjects:aWrappedDouble, aWrappedInt, nil]; 
0

Corrección: Todo lo que es pasado a través de setObject: no tienen que ser derivada de la clase NSObject, pero debe cumplir con el protocolo NSObject, que define retain y release.

Puede ser confuso, pero las clases y los protocolos tienen espacios de nombres diferentes. Y hay una clase y un protocolo llamado NSObject, la clase NSObject se ajusta al protocolo NSObject. Hay una clase de raíz más, la clase NSProxy que también se ajusta al protocolo NSObject.

Esto es importante, ya que de lo contrario los proxies no se podrían usar en colecciones y conjuntos de autobloques, mientras que todavía tienen una clase de raíz de proxy ligera.

0

NSInteger se sinónimo de largo integer.What sigue es como se define NSInteger:

#if __LP64__ || NS_BUILD_32_LIKE_64 
typedef long NSInteger; 
typedef unsigned long NSUInteger; 
#else 
typedef int NSInteger; 
typedef unsigned int NSUInteger; 
#endif 

NSNumber es una clase Objective-C, una subclase de NSValue para ser específico. Puede crear un objeto NSNumber a partir de un carácter firmado o sin signo, short int, int, long int, long long int, float, double o BOOL

Una de las principales distinciones es que puede usar NSNumber en colecciones, como NSArray, donde se requiere un objeto. Por ejemplo, si es necesario agregar un flotador en un NSArray, primero tendría que crear un objeto NSNumber del flotador:

float percentage = 40.5; 

... // Crear un objeto NSNumber, que ahora se puede insertar en un NSArray

NSNumber *percentageObject = [NSNumber numberWithFloat:percentage]; 
0

sólo tiene que utilizar: $(variable) sintaxis para convertir tipo primitivo de oponerse.

0

Referido a la respuesta de @Matt Ball: NSInteger no es un objeto, simplemente se encasilla a int en 32 bits o largo en 64 bits.Como NSDictionary solo puede almacenar objetos, debe envolver el entero en un objeto antes de poder almacenarlo.

Así, en el caso de Swift, así es como se hace:

let temp:NSInteger = yourInteger.hashValue 
Cuestiones relacionadas