2010-03-19 9 views
16

Je n'arrive pas à comprendre comment obtenir Objective-c pour auto-box mes primitives.Boxe automatique de primitives

Je suppose que je serais en mesure de faire ce qui suit

float foo = 12.5f; 
NSNumber* bar; 

bar = foo; 

Cependant, je trouve que je l'ai utilisé la méthode plus détaillée de

float foo = 12.5f; 
NSNumber* bar; 

bar = [NSNumber numberWithFloat:foo]; 

Est-ce que je fais mal ou est ce aussi bon que possible?

Répondre

28

Malheureusement, Objective-C ne fait pas d'auto-boxing ou unboxing de types primitifs à NSNumber. En d'autres termes, il peut être clair pourquoi: Objective-C n'a pas de concept de NSNumber, une classe dans le cadre de Cocoa Foundation. En tant que petit surensemble de C, Objective-C n'a pas de type d'objet numérique "natif" - juste les types C natifs.

Modifier août 2012 Comme de Xcode 4.4 (et 4.0 LLVM), vous pouvez maintenant utiliser un peu de sucre syntaxique pour envelopper les chiffres. Suite à votre exemple, ces "expressions boxed" fonctionnent maintenant:

float foo = 12.5f; 
NSNumber* bar; 

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

« incommode » plutôt que « malheureusement ». Les langages avec auto- (dé) boxe ne sont pas exempts de problèmes - en fait, beaucoup d'entre eux sont difficiles à repérer et peuvent causer des problèmes étranges. Par exemple, Effective Java et Java Puzzlers consacrent pas mal de pages à dissiper la confusion sur la façon dont les nombres agissent de façon inattendue dans diverses situations. Il serait très pratique d'avoir une auto-boxing, mais l'ajouter à la langue elle-même (comme vous le dites) serait non-trivial, et probablement rempli de périls cachés. –

+1

@Quinn Absolument. J'essayais vraiment de faire valoir que Objective-C ne pouvait pas facilement faire un autoboxing, sans essayer de porter un jugement sur la situation. N'importe lequel d'entre nous qui a "apprécié" l'autoboxing de Java sait que ce n'est pas un repas gratuit. J'ai entendu que C# est meilleur, mais je n'ai pas d'expérience personnelle avec laquelle juger. –

+4

Qui revient 2 ans plus tard pour ajuster sa réponse? Incroyable. Je cherchais la nouvelle syntaxe, merci! Donc, il n'y a pas de déballage automatique, bien sûr, non? –

0

Auto unboxing est possible dans l'objectif c ...

S'il vous plaît lire le code suivant

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

/// Maintenant, nous allons instancier Class1 dans class2 et nous attribuons va la par exemple une valeur variable par la réflexion

@implementation Class2 

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

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

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

} 

@end 

Si u exécutez le code ci-dessus, vous obtiendrez la valeur 3 ... Il n'y a pas d'erreur

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

La valeur de chaîne est donnée INTVAL 3 et il est auto Unboxed pour attribuer le type int à dire que je pourrais par exemple la variable INTVAL

+0

Je ne vois pas comment c'est unboxing. Je pensais que l'unboxing signifierait la conversion d'un NSNumber à un type primitif. – huggie

Questions connexes