我似乎无法弄清楚如何让Objective-c自动封装我的原语。
我以为我可以做以下
float foo = 12.5f;
NSNumber* bar;
bar = foo;
然而,我发现我已经习惯了更详细的
方法float foo = 12.5f;
NSNumber* bar;
bar = [NSNumber numberWithFloat:foo];
我做错了还是这样做得好?
答案 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