【发布时间】:2014-04-18 12:04:21
【问题描述】:
谁能告诉我使负 NSNumber 为正的最有效方法?
【问题讨论】:
-
NSNumber 本身不是数字,您可以使用
ABS来获取其任何数字表示形式的绝对值。 -
@EmilieLessard 这不是重复的,尽管另一个问题肯定解释了如何做这个问题的一部分。
-
你知道
NSNumber是从哪里来的吗?
谁能告诉我使负 NSNumber 为正的最有效方法?
【问题讨论】:
ABS 来获取其任何数字表示形式的绝对值。
NSNumber是从哪里来的吗?
一般来说这样做非常复杂,因为您需要找出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 来优化这一点。
【讨论】:
NSNumber objCType。
BOOL 值可能会保存为 char。
这样获取绝对值:
number = [NSNumber numberWithDouble:fabs([number doubleValue])];
【讨论】: