增加NSArray中的数字:语法是否更短?

时间:2015-03-17 10:12:40

标签: objective-c

我有几个NSNumber的数组。偶尔我想在数组内增加一个数字。这就是我目前的表现:

map[2] = [NSNumber numberWithInteger:[map[2] integerValue] + 1]

我必须将数字转换为NSInteger,然后在递增后将其重新转换为NSNumber,因为NSArray只接受id。

这感觉很错误。有更好的方法吗?

4 个答案:

答案 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;

在运行时看起来更优雅,效率更高。