代码之家  ›  专栏  ›  技术社区  ›  Jonathan

原语自动装箱

  •  16
  • Jonathan  · 技术社区  · 16 年前

    我似乎不知道如何让Objective-C自动装箱我的原语。

    我以为我能做到以下几点

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

    但是我发现我已经习惯了

    float foo = 12.5f;
    NSNumber* bar;
    
    bar = [NSNumber numberWithFloat:foo];
    

    我做错事了还是做得很好?

    3 回复  |  直到 13 年前
        1
  •  28
  •   Barry Wark    13 年前

    不幸的是,Objective-C不自动装箱或取消装箱原始类型到 NSNumber . 当这样说的时候,可能很清楚为什么:Objective-C没有 数字对象 是可可基金会框架中的一个类。作为C的一个小超集,Objective-C没有“本机”数字对象类型——只有本机C类型。

    编辑AUG 2012 从xcode 4.4(和llvm 4.0)开始,您现在可以使用一些语法糖分来包装数字。按照您的示例,这些“装箱表达式”现在可以工作了:

    float foo = 12.5f;
    NSNumber* bar;
    
    bar = @(foo);
    bar = @12.5f;
    
        2
  •  10
  •   nschum Solin    14 年前

    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;
    

    所以情况有点好转。:)

        3
  •  0
  •   Durai Amuthan.H    13 年前

    在目标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。