【问题标题】:Inverting a negative NSNumber反转一个负 NSNumber
【发布时间】:2014-04-18 12:04:21
【问题描述】:

谁能告诉我使负 NSNumber 为正的最有效方法?

【问题讨论】:

  • NSNumber 本身不是数字,您可以使用ABS 来获取其任何数字表示形式的绝对值。
  • 这个问题可能重复:Convert to absolute value in Objective-C
  • @EmilieLessard 这不是重复的,尽管另一个问题肯定解释了如何做这个问题的一部分。
  • 你知道NSNumber是从哪里来的吗?

标签: ios nsnumber


【解决方案1】:

一般来说这样做非常复杂,因为您需要找出NSNumber 中数字的正确类型。

这是一种方法:添加一个类别,并在实现中使用switch 语句来调度objCType 的值

@interface NSNumber (AbsoluteValue)

-(NSNumber*)abs;

@end

@implementation NSNumber (AbsoluteValue)

-(NSNumber*)abs {
    switch (self.objCType[0]) {
        // Cases below cover only signed types
      case 'c': return [NSNumber numberWithChar:abs([self charValue])];
      case 's': return [NSNumber numberWithShort:abs([self shortValue])];
      case 'i': return [NSNumber numberWithInt:abs([self intValue])];
      case 'q': return [NSNumber numberWithLongLong:llabs([self longLongValue])];
      case 'f': return [NSNumber numberWithFloat:fabsf([self floatValue])];
      case 'd': return [NSNumber numberWithDouble:fabs([self doubleValue])];
      // Otherwise, the number is of an unsigned type, so it can be returned directly
      default: return self;
    }
}

@end

当数字为正数时,您可以通过返回 self 来优化这一点。

【讨论】:

【解决方案2】:

这样获取绝对值:

number = [NSNumber numberWithDouble:fabs([number doubleValue])];

【讨论】:

  • 得到这个:指向整数转换的不兼容指针将'NSNumber *'传递给'int'类型的参数
  • 除非你在那里可能有一个十进制值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多