自动拳击原语

时间:2010-03-19 12:25:02

标签: objective-c

我似乎无法弄清楚如何让Objective-c自动封装我的原语。

我以为我可以做以下

float foo = 12.5f;
NSNumber* bar;

bar = foo;

然而,我发现我已经习惯了更详细的

方法
float foo = 12.5f;
NSNumber* bar;

bar = [NSNumber numberWithFloat:foo];

我做错了还是这样做得好?

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:10)

Clang 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;

所以它变得更好了。 :)

答案 2 :(得分:0)

可以在Objective 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