在iOS中制作整数数组


98

如果要创建整数数组,可以使用NSInteger吗?您必须使用NSNumber吗?如果是这样,那为什么呢?


您想对整数数组做什么?
dreamlax

不确定。我刚刚听到某个地方,您必须对数组使用NSNumber,所以我对此感到疑惑。
Neuromancer 2010年

Answers:


159

您可以使用普通的旧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实际上要麻烦得多。
Chuck 2010年

2
是的,考虑到专家级别的[大概]优化NSArray,我相信您不会觉得性能受到影响。
dreamlax

@dreamlax我想知道NSArray是什么样的专家级优化?一旦达到极限,智能内存分配可能只是分配的内存大小的两倍?:)p
本·辛克莱

2
@Andy:看一看为CFArray实际的源位置,并检查了基准这里。它比您最初想象的要聪明。
dreamlax

假设此数组仅在方法中使用,则使用NSIntegers的C数组没有任何问题吗?只需
仔细

58

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

快速数组:

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

这也是正确的:

var array = Array(1...10)

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

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

如果您想要一个Doubles数组,则可以使用:

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 2014年

5

如果要使用NSArray,则需要放入一个Objective-C类-因此需要NSNumber。

就是说,Obj-C仍然是C,因此您可以使用常规C数组并在需要时保留常规int而不是NSNumbers。


4

您可以使用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 2012年


3

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

您还可以使用NSIndexSet或NSMutableIndexSet您将能够轻松地添加和删除整数,或者检查数组是否包含带有

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

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


2
那是一个可怕的主意。这是来自Apple文档的内容:不应使用索引集来存储任意整数值集合,因为索引集会将索引存储为排序范围。这使它们比存储单个整数的集合更有效。这也意味着每个索引值只能在索引集中出现一次。
2013年

1
我同意,这就是为什么我以警告开始回复。但是,我知道有人问这个关于整数数组的问题,实际上需要一个索引集。这就是为什么我给出了这个替代答案。
didier_v_

仅使用常规字符NSSet(并使用包裹在中的整数NSNumber)有什么问题?
dreamlax

@dreamlax开销很大,但是一般来说,问这样的问题的人无法处理C,而且他们只存储很少的数字,因此NSArray或NSSet必须是最好的。
本辛克莱

2

我认为使用NSNumbers要容易得多。这就是您需要做的所有事情:

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

但是如果您的数组有10或100个数字怎么办?
亨森

1
您可以使用for或仅使用另一个数组作为数字,然后使用arrayWithArray
Neeku
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.