在iOS中创建一个整数数组

105
如果您想创建一个整数数组,可以使用NSInteger吗?您必须使用NSNumber吗?如果是这样,为什么要使用NSNumber?
7个回答

164
您可以使用一个普通的C数组:
NSInteger myIntegers[40];

for (NSInteger i = 0; i < 40; i++)
    myIntegers[i] = i;

// to get one of them
NSLog (@"The 4th integer is: %d", myIntegers[3]);

或者,您可以使用 NSArrayNSMutableArray,但此时您需要将每个整数封装在一个NSNumber实例中(因为NSArray对象是设计用于保存类实例的)。

NSMutableArray *myIntegers = [NSMutableArray array];

for (NSInteger i = 0; i < 40; i++)
    [myIntegers addObject:[NSNumber numberWithInteger:i]];

// to get one of them
NSLog (@"The 4th integer is: %@", [myIntegers objectAtIndex:3]);

// or
NSLog (@"The 4th integer is: %d", [[myIntegers objectAtIndex:3] integerValue]);

9
值得注意的是,对于除了一次性使用以外的任何复杂情况,C 数组都非常麻烦,因此将您计划保留的任何数组包装为 NSNumber 的 NSArray 实际上比使用 C 数组更加简单。 - Chuck
2
是的,考虑到NSArray底层的[可能是]专家级别的优化,我相信您不会感受到性能损失。 - dreamlax
@dreamlax 我想知道NSArray底层采用了什么专业级别的优化技术?智能内存分配策略,当达到限制时自动加倍已分配内存的大小吗? :)p - pronebird
2
@Andy:看一下CFArray的实际源代码这里,并查看基准测试这里。它比你最初想象的要聪明一些。 - dreamlax
假设这个数组只在一个方法内使用,使用NSIntegers的C数组没有问题吗?只是再次确认一下... - Dan Rosenstark
@DanRosenstark 我认为不是,因为据我所知 NSInteger 只是 inttypedef - Franklin Yu

66

C数组:

NSInteger array[6] = {1, 2, 3, 4, 5, 6};

Objective-C数组:

NSArray *array = @[@1, @2, @3, @4, @5, @6];
// numeric values must in that case be wrapped into NSNumbers

Swift 数组:

var array = [1, 2, 3, 4, 5, 6]

这也是正确的:

var array = Array(1...10)

注意:Swift中的数组是强类型的;在这种情况下,编译器可以从内容推断出数组是一个整数数组。你也可以使用显式类型语法:

var array: [Int] = [1, 2, 3, 4, 5, 6]
如果你想要一个 Double 类型的数组,你可以使用:
var array = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] // implicit type-inference
或者:
var array: [Double] = [1, 2, 3, 4, 5, 6] // explicit type

1
负整数的等效“@number”语法是什么? - Ziofil

5
你可以使用CFArray代替NSArray。这里有一篇解释如何做的文章。
CFMutableArrayRef ar = CFArrayCreateMutable(NULL, 0, NULL);
for (NSUInteger i = 0; i < 1000; i++)
{
  CFArrayAppendValue(ar, (void*)i);
}
CFRelease(ar); /* Releasing the array */

同样适用于其他容器的CoreFoundation版本。

3
如果使用CFArray比NSArray更有优势,我就没有看出来。在底层,NSArray其实就是CFArray;这种方式只是让事情变得更加困难了。 - David Gish
1
@Cryptognome 这里有一个小区别,CFArray不会保留或释放任何东西,因为它是没有回调函数创建的。虽然我同意,似乎没有任何优势。 - dreamlax

5

如果你想使用NSArray,你需要一个Objective-C类来放置其中 - 因此需要NSNumber。

话虽如此,Obj-C仍然是C语言,因此如果需要,你可以使用常规的C数组并保存常规的整数,而不是NSNumbers。


4

4

如果不需要对整数排序,并且只有唯一的值

你也可以使用NSIndexSet或NSMutableIndexSet。你可以轻松地添加和删除整数,或者检查你的数组是否包含一个整数。

- (void)addIndex:(NSUInteger)index
- (void)removeIndex:(NSUInteger)index
- (BOOL)containsIndexes:(NSIndexSet *)indexSet

请查看文档以获取更多信息。


2
这是个糟糕的想法。以下是苹果文档中的一段内容:您不应该使用索引集来存储任意整数值的集合,因为索引集将索引存储为排序范围。这使它们比存储单个整数的集合更有效率。这也意味着每个索引值只能在索引集中出现一次。 - Rudolf Adamkovič
1
我同意,这就是为什么我在回复中开始发出警告的原因。然而,我认识一些人询问关于整数数组的问题,实际上需要一个索引集。这就是为什么我给出这个替代答案的原因。 - didier_v_
仅使用常规的 NSSet (并使用包装在 NSNumber 中的整数) 有什么问题吗? - dreamlax
@dreamlax 一般来说,人们提出这样的问题通常是因为他们无法处理C语言,并且只需要存储少量数字,因此NSArray或NSSet可能是最好的选择。 - pronebird

2

我认为使用NSNumbers更加容易。你只需要这样做:

NSNumber *myNum1 = [NSNumber numberWithInt:myNsIntValue1];
NSNumber *myNum2 = [NSNumber numberWithInt:myNsIntValue2];
.
.
.
NSArray *myArray = [NSArray arrayWithObjects: myNum1, myNum2, ..., nil];

但是如果你的数组有10个或100个数字呢? - Henson
1
你可以使用 for 循环或者另一个数组来存储数字,然后使用 arrayWithArray 方法。 - Neeku

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接