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

想知道如何在算术运算中处理nsnumber对象

  •  3
  • nickthedude  · 技术社区  · 15 年前

    我看到了这条线,但想确认一下:

    How to convert NSNumber objects for computational purposes?

    所以基本上,每当你想处理这些对象的时候,你都必须将它们的ivar解包,然后将它们重新打包成新的对象,大概是nsnumber?

    那看起来像是地狱般的虚弱(而且后背疼得厉害,不是吗?).

    你们怎么处理这些?

    你会避开他们吗?子类?有可变版本吗?

    这似乎是很多工作来处理它们,希望听到它们的好处和经验丰富的程序员使用它们的方式,或者它们使用了什么策略来避免使用它们。

    谢谢,

    尼克

    3 回复  |  直到 12 年前
        1
  •  6
  •   kennytm    15 年前

    所以基本上,每当你想处理这些对象的时候,你都必须将它们的ivar解包,然后将它们重新打包成新的对象,大概是nsnumber?

    对。(顺便问一下 doubleValue 不仅仅意味着打开IVAR。可能还有一些转换。)

    那看起来像是地狱般的虚弱(而且后背疼得厉害,不是吗?).

    这种“装箱”是必要的,因为原始数字本身不支持Objto-C(Foundation。框架)的REF计数方案。例如,您必须将数字框选为 NSNumber 以便将它们存储在 NSArray .

    你会避开他们吗?

    你不能。

    子类?

    你不应该这样做,但如果必须这样做,请遵循建议:

    • 与任何类集群一样,如果创建nsnumber的子类,则必须重写其超类nsvalue的基元方法。此外,为了利用非原语方法的抽象实现,nsvalue方法objctype的实现可以返回一组受限的返回值。The valid return values are “c”, “C”, “s”, “S”, “i”, “I”, “l”, “L”, “q”, “Q”, “f”, and “d”.

    如果你只想添加一些方便的方法,例如 -numberByAddingNumber: 使用A 类别 :

    @implementation NSNumber (MyExtension)
    -(NSNumber*)numberByAddingNumber:(NSNumber*)another {
       double myVal = [self doubleValue];
       double anotherVal = [another doubleValue];
       return [NSNumber numberWithDouble:myVal + anotherVal];
    }
    @end
    ...
    NSNumber* a, *b;
    ...
    NSNumber* c = [a numberByAddingNumber:b];
    ...
    

    有可变版本吗?

    不。

        2
  •  3
  •   kubi    15 年前

    当我要对一个变量执行算术运算时,我避免使用nsnumber。实际上,我总是避免使用它们,除非我要将它们转化为核心数据或其他东西。

        3
  •  2
  •   Maxthon Chan    12 年前

    现在clang编译器的最新版本(版本3.2以上,Xcode 4.6随附,也可以从源代码构建)中有了objective-c文本,您可以对“box”nsnumber执行@42和@(7+35)之类的操作。

    推荐文章