2010-03-19 60 views
16

我似乎无法弄清楚如何让Objective-c自动将我的原始装箱。自动装箱的基元

我认为我将能够做到以下几点

float foo = 12.5f; 
NSNumber* bar; 

bar = foo; 

但是我发现,我已经习惯了的

float foo = 12.5f; 
NSNumber* bar; 

bar = [NSNumber numberWithFloat:foo]; 

了更详细的方法我是做错了或者是这个要多好能有多好?

回答

28

不幸的是,Objective-C没有对原始类型进行自动装箱或拆箱,以NSNumber。当这样做时,可能很清楚为什么:Objective-C没有概念NSNumber,这是Cocoa Foundation框架中的一个类。作为C的一个小超集,Objective-C没有“本地”数字对象类型 - 只是本地C类型。

编辑日期2012年8月 从Xcode 4.4(和LLVM 4.0)开始,您现在可以使用一些语法糖来包装数字。继你的榜样,这些 “盒装表述” 现在的工作:

float foo = 12.5f; 
NSNumber* bar; 

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

我可能会说“不便”,而不是“不幸”。带有自动(非)拳击的语言并不是没有问题 - 事实上,他们中的很多很难找到并且可能导致奇怪的问题。例如,Effective Java和Java Puzzlers花了不少篇幅来解决数字在各种情况下意外行为的混淆。自动装箱会非常方便,但是将其添加到语言本身(正如您所指出的那样)将是不平凡的,并且可能充满了隐藏的危险。 –

+1

@昆因绝对。我真的试图指出Objective-C不容易做自动装箱,而不是试图对情况做出判断。我们中任何一个享受过Java自动装箱的人都知道这不是免费的午餐。我听说C#更好,但没有亲自体验哪种判断。 –

+4

2年后谁回来调整他们的答案?惊人。我正在寻找新的语法,谢谢!所以没有自动拆箱,当然,对吧? –

0

自动拆箱是目标C可能...

请仔细阅读下面的代码

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

///现在我们要实例化的Class2 Class1的,我们会分配实例变量通过反射值

@implementation Class2 

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

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

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

} 

@end 

如果妳运行上面的代码,你会得到价值3 ...没有错误

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

的INTVAL被赋予字符串值3,它的自动拆箱指定int型实例变量INTVAL

+0

我不明白这是如何拆箱。我认为拆箱意味着从NSNumber转换为原始类型。 – huggie