web-dev-qa-db-ja.com

Swift 3Intの2次元配列

実はとても簡単な質問ですが、1時間経っても問題は解決できません。

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

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

値を変更しようとしました:

arr[x][y] = 1

致命的なエラー:インデックスが範囲外

APPENDを使用する必要がありますか、それとも配列のサイズを指定する必要がありますか?

よくわかりません..

8
Mikhail Sein

本当に簡単ではありません。この線:

var arr : [[Int]] = []

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

単一の配列に戻りましょう。

var row : [Int] = []

これで空の配列ができました。あなたはただすることはできません:

row[6] = 10

インデックス6(7番目の値)の値にアクセスする前に、まず配列に7つの値を追加する必要があります。

配列の配列を使用して、外側の配列に内側の配列のセット全体を入力する必要があります。そして、これらの内部配列のそれぞれに、適切な数の値を入力する必要があります。

すべての値が0に設定された事前入力された行列が必要であると想定して、配列の配列を初期化する簡単な方法の1つを次に示します。

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
20
rmaddy

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

これは、Swiftがサブ配列を初期化せず、インデックスに割り当てるときに配列の長さをインクリメントしないためです。

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

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

代わりに、保持する要素の数で配列を初期化し、デフォルト値(たとえば、ゼロ)で埋めることができます。

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

0の値に初期化された100x 100の行列を作成するには:

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

マトリックスの初期サイズを指定したくない場合は、次の方法で指定できます。

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