iOSで整数の配列を作成する


98

整数の配列を作成したい場合、NSIntegerを使用できますか?NSNumberを使用する必要がありますか?もしそうなら、なぜですか?


整数の配列で何をしたいですか?
dreamlax 2010

わからない。配列にNSNumberを使用する必要があると聞いたところ、そのことを考えていました。
ニューロマンサー

回答:


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
NSNumberのNSArraysとして保持する予定の配列をラップすることは、C配列が些細な1回限りの使用以外の面倒な問題であることは注目に値します。
チャック

2
はい、そしてのフードの下で[おそらく]エキスパートレベルの最適化を考えるNSArrayと、パフォーマンスへの影響は感じられないと思います。
dreamlax 2010

@dreamlax NSArrayの内部にはどのようなエキスパートレベルの最適化があるのでしょうか。制限に達すると、割り当てられたメモリのサイズがおそらく2倍になるスマートなメモリ割り当てですか?:)p
ベンシンクレア2014年

2
@Andy:ここでCFArrayの実際のソースを確認し、ここでベンチマークを確認してください。それはあなたが最初に考えるよりも少し賢いです。
dreamlax 2014年

この配列がメソッド内でのみ使用されていると仮定すると、NSIntegersのC配列を使用しても問題はありませんか?ちょうどダブルチェック...
Dan Rosenstark

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

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 2014

5

NSArrayを使用したい場合は、Objective-Cクラスを配置する必要があります-したがって、NSNumberの要件です。

そうは言っても、Obj-CはCのままなので、必要に応じて、通常のC配列を使用して、NSNumbersの代わりに通常のintを保持できます。


4

NSArrayの代わりにCFArrayを使用できます。こちらがその方法を説明した記事です。

CFMutableArrayRef ar = CFArrayCreateMutable(NULL, 0, NULL);
for (NSUInteger i = 0; i < 1000; i++)
{
  CFArrayAppendValue(ar, (void*)i);
}
CFRelease(ar); /* Releasing the array */

同じことが他のコンテナのCoreFoundationバージョンにも当てはまります。


3
NSArrayよりもCFArrayを使用する利点がある場合、私にはわかりません。NSArrayは内部でCFArrayです。これは難しい方法です。
デビッドギッシュ

1
@Cryptognomeここには小さな違いがあります。CFArrayはコールバックなしで作成されたため、何も保持または解放しません。私は同意しますが、何の利点もないようです。
dreamlax 2012年


3

整数の順序が不要で、一意の値しかない場合

NSIndexSetまたはNSMutableIndexSetを使用することもできます。整数を簡単に追加または削除したり、配列に整数が含まれているかどうかを確認したりできます。

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

詳細については、ドキュメントを確認してください。


2
それはひどい考えです。以下はAppleのドキュメントの一部です。インデックスセットはインデックスをソートされた範囲として格納するため、インデックスセットを使用して整数値の任意のコレクションを格納しないでください。これにより、個々の整数のコレクションを格納するよりも効率的になります。また、各インデックス値は、インデックスセット内に1回しか出現できません。
ルドルフアダムコビッチ2013年

1
私は同意し、これが私が警告を出して返信を始めた理由です。ただし、整数配列についてこの質問をしていて、実際にインデックスセットが必要な人もいます。だから私はこの別の答えを出しました。
didier_v_ 2013年

普通の何が間違っているNSSet(で包み、使用して整数NSNumber)?
dreamlax 2014年

@dreamlaxオーバーヘッドですが、一般的に言えば、そのような質問をする人はCを処理できず、格納する数が少ないため、NSArrayまたはNSSetが最適です。
ベンシンクレア2014年

2

NSNumbersを使う方がずっと簡単だと思います。これはあなたがする必要があるすべて:

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

しかし、配列に10または100の数値がある場合はどうなりますか?
ヘンソン2013年

1
forまたは、別の配列を数値に使用できますarrayWithArray
Neeku 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.