2016-10-06 3 views
6

これは実際にはとても簡単な質問ですが、1時間後に私の問題を解決することはできません。Swift 3 2d Intの配列

Intの2次元配列を作成する必要があります。

は、私がAPPEND使うべきか、私は、配列のサイズを指定する必要がある範囲外のインデックス:

arr[x][y] = 1 

致命的なエラー:

var arr = [[Int]]() 
or 
var arr : [[Int]] = [] 

は値を変更しようとしましたか?

私は混乱しています。

答えて

17

本当にシンプルではありません。

var arr : [[Int]] = [] 

タイプArray of Array of Intの変数を作成し、最初は配列が空です。 Swiftの他の配列と同じように、これを設定する必要があります。バック単一のアレイに

レッツ・ステップ:

var row : [Int] = [] 

あなたは今、空の配列を持っています。あなただけで行うことはできません。

row[6] = 10 

あなたが最初にあなたがインデックス6(7値)で値にアクセスする前に、アレイへの7つの値を追加する必要があります。

あなたの配列の配列では、内部配列のセット全体で外側の配列を塗りつぶす必要があります。これらの内部配列のそれぞれには、適切な数の値を書き込む必要があります。ここで

あなたは0

var matrix : [[Int]] = Array(repeating: Array(repeating: 0, count: 10), count: 10) 

外側の回数に設定され、すべての値が予め充填されたマトリックスをしたいと仮定すると配列のあなたの配列を初期化する一つの簡単な方法である行の数を表し、内側のカウントが表し列の数必要に応じてそれぞれを調整します。

今、あなたは、行列の任意のセルにアクセスすることができます。

matrix[x][y] = 1 // where x and y are from 0 to rows-1/columns-1 
+0

ありがとう、どのアレイタイプでも機能しますか?そのようなUIViewなどの配列 –

+0

'Array'はどの型でも保持できるからです。宣言と内部の 'repeated'パラメータに渡された値を変更するだけです。値をオプションにして、繰り返し値に対して 'nil'を渡すことさえできます。 – rmaddy

1

だけでなく、あなたが任意の値を割り当てることができるようになる前に、アレイとサブアレイの両方を初期化する必要がなく、各配列の長さがより大きくなければなりませんあなたが設定しようとしているインデックス位置。

これは、Swiftはサブアレイを初期化しないため、インデックスに割り当てるときに配列の長さを増やさないためです。

たとえば、次のコードは失敗します。

var a = [Int]() 
a[0] = 1 
// fatal error: Index out of range 

代わりに、あなたが保持する要素の数を持つ配列を初期化することができ、例えばゼロ、デフォルト値でそれを埋める:

var a = Array(repeating: Array(repeating: 0, count: 100), count: 100) 
a[0][0] = 1 

var a = Array(repeating: 0, count: 100) 
a[0] = 1 
// a == [1, 0, 0, 0...] 
は0の値に初期化100によって100の行列を作成しますあなたは、このようにそれを行うことができ、あなたのマトリックスのための初期サイズを指定しない場合:

var a = [[Int]]() 
a.append([]) 
a[0].append(1) 
0

使用辞書の代わりに配列。

要件に基づいて、arrayOfDictまたはdictOfDictを使用できます。 速攻4では、デフォルト値を割り当てることができます。

var arrayOfDict = [[Int: Int]]() 
arrayOfDict[i][j, default: 0] 
arrayOfDict[i][j] = 0 

var dictOfDict = [Int: [Int: Int]]() 
dictOfDict[i, default: [0: 0]][j, default: 0] 
dictOfDict[i][j] = 0