我似乎无法弄清楚如何让Objective-c自动将我的原始装箱。自动装箱的基元
我认为我将能够做到以下几点
float foo = 12.5f;
NSNumber* bar;
bar = foo;
但是我发现,我已经习惯了的
float foo = 12.5f;
NSNumber* bar;
bar = [NSNumber numberWithFloat:foo];
了更详细的方法我是做错了或者是这个要多好能有多好?
我似乎无法弄清楚如何让Objective-c自动将我的原始装箱。自动装箱的基元
我认为我将能够做到以下几点
float foo = 12.5f;
NSNumber* bar;
bar = foo;
但是我发现,我已经习惯了的
float foo = 12.5f;
NSNumber* bar;
bar = [NSNumber numberWithFloat:foo];
了更详细的方法我是做错了或者是这个要多好能有多好?
不幸的是,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;
锵3.1和Apple LLVM 4.0(包含在Xcode 4.4)支持新的拳击功能:http://clang.llvm.org/docs/ObjectiveCLiterals.html#objc_boxed_expressions
现在,您可以这样写:
NSNumber *bar = @(foo);
还有:
NSNumber *bar = @12.5F;
所以它只是有一个小更好。 :)
自动拆箱是目标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
我不明白这是如何拆箱。我认为拆箱意味着从NSNumber转换为原始类型。 – huggie
我可能会说“不便”,而不是“不幸”。带有自动(非)拳击的语言并不是没有问题 - 事实上,他们中的很多很难找到并且可能导致奇怪的问题。例如,Effective Java和Java Puzzlers花了不少篇幅来解决数字在各种情况下意外行为的混淆。自动装箱会非常方便,但是将其添加到语言本身(正如您所指出的那样)将是不平凡的,并且可能充满了隐藏的危险。 –
@昆因绝对。我真的试图指出Objective-C不容易做自动装箱,而不是试图对情况做出判断。我们中任何一个享受过Java自动装箱的人都知道这不是免费的午餐。我听说C#更好,但没有亲自体验哪种判断。 –
2年后谁回来调整他们的答案?惊人。我正在寻找新的语法,谢谢!所以没有自动拆箱,当然,对吧? –