私はSwiftの2D配列についてとても混乱しています。ステップバイステップで説明しましょう。私が間違っているなら、あなたは私を直してください。
まず第一に;空の配列の宣言
class test{
var my2Darr = Int[][]()
}
次に配列を埋めます。 (my2Darr[i][j] = 0
、i、jはforループ変数)
class test {
var my2Darr = Int[][]()
init() {
for(var i:Int=0;i<10;i++) {
for(var j:Int=0;j<10;j++) {
my2Darr[i][j]=18 /* Is this correct? */
}
}
}
}
そして最後に、配列の要素を編集する
class test {
var my2Darr = Int[][]()
init() {
.... //same as up code
}
func edit(number:Int,index:Int){
my2Darr[index][index] = number
// Is this correct? and What if index is bigger
// than i or j... Can we control that like
if (my2Darr[i][j] == nil) { ... } */
}
}
// 2 dimensional array of arrays of Ints
var arr = [[Int]]()
または:
// 2 dimensional array of arrays of Ints
var arr: [[Int]] = []
(コメントの@ 0x7fffffffで言及されているように)定義済みサイズの配列が必要な場合は、
// 2 dimensional array of arrays of Ints set to 0. Arrays size is 10x5
var arr = Array(count: 3, repeatedValue: Array(count: 2, repeatedValue: 0))
// ...and for Swift 3+:
var arr = Array(repeating: Array(repeating: 0, count: 2), count: 3)
arr[0][1] = 18
OR
let myVar = 18
arr[0][1] = myVar
arr[1] = [123, 456, 789]
OR
arr[0] += 234
OR
arr[0] += [345, 678]
これらの変更の前に0(zeros)の3x2配列があったとしたら、次のようになります。
[
[0, 0, 234, 345, 678], // 5 elements!
[123, 456, 789],
[0, 0]
]
そのため、サブ配列は変更可能であり、行列を表す初期配列を再定義することができます。
let a = 0
let b = 1
if arr.count > a && arr[a].count > b {
println(arr[a][b])
}
備考 3次元配列とN次元配列のマークアップ規則は同じです。
ドキュメントから:
多次元配列を作成するには、角括弧のペアをネストします。要素の基本型の名前は、最も内側の角括弧のペアに含まれています。たとえば、3組の角括弧を使用して整数の3次元配列を作成できます。
var array3D: [[[Int]]] = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
多次元配列の要素にアクセスするとき、一番左の添え字インデックスは最も外側の配列のそのインデックスにある要素を参照します。右隣の添え字インデックスは、1レベルネストした配列内のそのインデックスの要素を参照します。以降も同様です。つまり、上記の例では、array3D [0]は[[1、2]、[3、4]]を表し、array3D [0] [1]は[3、4]を表し、array3D [0] [1]を表します。 ] [1]は値4を表します。
Array(repeating: Array(repeating: {value}, count: 80), count: 24)
を使うときは注意が必要です。
値がMyClass()
によって初期化されるオブジェクトであるならば、それらは同じ参照を使います。
Array(repeating: Array(repeating: MyClass(), count: 80), count: 24)
は、各配列要素にMyClass
の新しいインスタンスを作成しません。このメソッドはMyClass
を1回だけ作成してそれを配列に入れます。
これは多次元配列を初期化するための安全な方法です。
private var matrix: [[MyClass]] = MyClass.newMatrix()
private static func newMatrix() -> [[MyClass]] {
var matrix: [[MyClass]] = []
for i in 0...23 {
matrix.append( [] )
for _ in 0...79 {
matrix[i].append( MyClass() )
}
}
return matrix
}
Swift 4では
var arr = Array(repeating: Array(repeating: 0, count: 2), count: 3)
// [[0, 0], [0, 0], [0, 0]]
汎用にするSwift 4
struct Matrix<T> {
let rows: Int, columns: Int
var grid: [T]
init(rows: Int, columns: Int,defaultValue: T) {
self.rows = rows
self.columns = columns
grid = Array(repeating: defaultValue, count: rows * columns) as! [T]
}
func indexIsValid(row: Int, column: Int) -> Bool {
return row >= 0 && row < rows && column >= 0 && column < columns
}
subscript(row: Int, column: Int) -> T {
get {
assert(indexIsValid(row: row, column: column), "Index out of range")
return grid[(row * columns) + column]
}
set {
assert(indexIsValid(row: row, column: column), "Index out of range")
grid[(row * columns) + column] = newValue
}
}
}
var matrix:Matrix<Bool> = Matrix(rows: 1000, columns: 1000,defaultValue:false)
matrix[0,10] = true
print(matrix[0,10])
Swift 4.1に関するAppleの文書によれば、この構造体を使って2D配列を簡単に作成できます。
コードサンプル:
struct Matrix {
let rows: Int, columns: Int
var grid: [Double]
init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns
grid = Array(repeating: 0.0, count: rows * columns)
}
func indexIsValid(row: Int, column: Int) -> Bool {
return row >= 0 && row < rows && column >= 0 && column < columns
}
subscript(row: Int, column: Int) -> Double {
get {
assert(indexIsValid(row: row, column: column), "Index out of range")
return grid[(row * columns) + column]
}
set {
assert(indexIsValid(row: row, column: column), "Index out of range")
grid[(row * columns) + column] = newValue
}
}
}