2010-03-19 5 views
16

Parece que no puedo encontrar la forma de hacer que Objective-c autocapture mis primitivas.Auto Boxing of primitives

que supone que yo sería capaz de hacer lo siguiente

float foo = 12.5f; 
NSNumber* bar; 

bar = foo; 

Sin embargo me parece que he utilizado el método más detallado de

float foo = 12.5f; 
NSNumber* bar; 

bar = [NSNumber numberWithFloat:foo]; 

lo estoy haciendo mal o es esta ¿Mejor imposible?

Respuesta

28

Desafortunadamente, Objective-C no hace auto-boxing o unboxing de tipos primitivos a NSNumber. Cuando se pone de esa manera, puede estar claro por qué: Objective-C no tiene un concepto de NSNumber, una clase en el marco de la Fundación Cocoa. Como un pequeño superconjunto de C, Objective-C no tiene un tipo de objeto numérico "nativo", solo los tipos C nativos.

Editar Aug 2012 Como de Xcode 4.4 (y LLVM 4.0), ahora se puede utilizar un poco de azúcar sintáctica para envolver números. Siguiendo su ejemplo, estas expresiones "caja" ahora funcionan:

float foo = 12.5f; 
NSNumber* bar; 

bar = @(foo); 
bar = @12.5f; 
+6

podría decir "inconveniente" en lugar de "desgracia". Los idiomas con auto (un) boxeo no están libres de problemas, de hecho, muchos de ellos son difíciles de detectar y pueden causar problemas extraños. Por ejemplo, Effective Java y Java Puzzlers dedican bastantes páginas a aclarar la confusión sobre cómo los números actúan inesperadamente en diversas situaciones. Sería bastante conveniente tener el auto-boxing, pero agregarlo al lenguaje en sí (como usted señala) no sería trivial y probablemente estaría lleno de peligros ocultos. –

+1

@Quinn Absolutamente. Realmente estaba tratando de aclarar que Objective-C no podía hacer autoboxing fácilmente, no tratando de hacer un juicio sobre la situación. Cualquiera de nosotros que haya "disfrutado" el autoboxing de Java sabe que no es un almuerzo gratis. He escuchado que C# es mejor, pero no tengo experiencia personal para juzgar. –

+4

¿Quién vuelve 2 años después para ajustar su respuesta? Asombroso. Estaba buscando la nueva sintaxis, gracias! Entonces no hay unboxing automático, por supuesto, ¿verdad? –

0

Auto unboxing es posible en c ... Objetivo

Por favor, lea el siguiente código

@interface Class1 : NSObject 
@property(nonatomic,assign)int intval; 
@end 

/// Ahora vamos a crear una instancia de clase 1 en la clase 2 y nos va a asignar el instancia de variable un valor medio de la reflexión

@implementation Class2 

-(void)TestClass1 
{ 
    Class1 *clsObj=[[Class1 alloc]init]; 

    [clsObj setValue:@"3" forKey:@"intval"]; 

    NSLog(@"%d",clsObj.intval); 

} 

@end 

Si u ejecutar el código anterior obtendrá valor de 3 ... no hay error

[clsObj setValue:@"3" forKey:@"intval"]; 

El intval se le da valor de cadena 3 y es automático sin embalaje asignar como tipo int a la variable de instancia intval

+0

No veo cómo eso es unboxing. Pensé que unboxing significaría la conversión de un NSNumber a un tipo primitivo. – huggie