我有几个NSNumber的数组。偶尔我想在数组内增加一个数字。这就是我目前的表现:
map[2] = [NSNumber numberWithInteger:[map[2] integerValue] + 1]
我必须将数字转换为NSInteger,然后在递增后将其重新转换为NSNumber,因为NSArray只接受id。
这感觉很错误。有更好的方法吗?
答案 0 :(得分:2)
您可以使用@(...)
语法稍微简化一下:
map[@2] = @([map[@2]integerValue] + 1);
但是,一般方法保持不变,因为NSNumber
对象是不可变的。如果Cocoa提供NSMutableNumber
类会更容易,但框架中缺少它。
如果您希望每次增加值时都避免创建新的NSNumber
实例,则可以创建一个类似于NSNumber
的可变对象,它将支持就地增量,减量等等上。
答案 1 :(得分:1)
这对我有用:
NSMutableArray *foo = [NSMutableArray arrayWithArray:@[@1]];
foo[0] = @([foo[0] integerValue] + 1);
NSLog(@"---> %d", [foo[0] intValue]); // 2
换句话说,您可能正在寻找@(expression)
语法来将数字标记为NSNumber
。
答案 2 :(得分:1)
这不仅仅是因为地图接受id s ,它也是因为NSNumbers是不可变的,它是冗长的,但这是唯一的方法遗憾的是,这样做。
答案 3 :(得分:0)
如果您需要反复或经常更改数组中的数字,我会使用一些额外的准备工作来实现该解决方案,而不是使用不可变的NSNumber
。
最终,您可以在花费更多精力实现新的类和类 之后实现这种语法(请参阅下面的步骤!) 强>:
[_array numberAtIndex:0].numberValue++;
在我看来,这种解决方案在长期内更加复杂,并且使您的代码在以后更具可读性:
<强> GSNumber.h 强>
@interface GSNumber : NSObject
+ (instancetype)numberWithInteger:(NSInteger)value;
+ (instancetype)number;
@property (nonatomic) NSInteger numberValue;
- (NSInteger)integerValue;
@end
<强> GSNumber.m 强>
@implementation GSNumber
+ (instancetype)number {
return [[GSNumber alloc] init];
}
+ (instancetype)numberWithInteger:(NSInteger)value {
GSNumber *_number = [GSNumber number];
_number.numberValue = value;
return _number;
}
- (NSInteger)integerValue {
return self.numberValue;
}
@end
我还会在NSArray
上创建一个类别,它看起来像这样:
<强>的NSArray + GSNumber.h 强>
#import "GSNumber.h"
@interface NSArray (GSNumber)
- (GSNumber *)numberAtIndex:(NSUInteger)index;
@end
<强>的NSArray + GSNumber.m 强>
@implementation NSArray (GSNumber)
- (GSNumber *)numberAtIndex:(NSUInteger)index {
id _obj = [self objectAtIndex:index];
return [_obj isKindOfClass:[GSNumber class]] ? _obj : nil;
}
@end
然后你可以在启动时做一个更易读的代码:
NSArray *_array = [NSArray arrayWithObject:[GSNumber numberWithInteger:12]]; // you don't need mutable array in this example
您可以稍后增加数值,而无需额外的努力:
[_array numberAtIndex:0].numberValue++;
// OR
[_array numberAtIndex:0].numberValue += 1;
在运行时看起来更优雅,效率更高。