# Two-dimensional array in Swift

## Define mutable array

``````// 2 dimensional array of arrays of Ints
var arr = [[Int]]()
``````

OR:

``````// 2 dimensional array of arrays of Ints
var arr: [[Int]] = []
``````

OR if you need an array of predefined size (as mentioned by @0x7fffffff in comments):

``````// 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)
``````

## Change element at position

``````arr[0][1] = 18
``````

OR

``````let myVar = 18
arr[0][1] = myVar
``````

## Change sub array

``````arr[1] = [123, 456, 789]
``````

OR

``````arr[0] += 234
``````

OR

``````arr[0] += [345, 678]
``````

If you had 3×2 array of 0(zeros) before these changes, now you have:

``````[
[0, 0, 234, 345, 678], // 5 elements!
[123, 456, 789],
[0, 0]
]
``````

So be aware that sub arrays are mutable and you can redefine initial array that represented matrix.

## Examine size/bounds before access

``````let a = 0
let b = 1

if arr.count > a && arr[a].count > b {
println(arr[a][b])
}
``````

Remarks:
Same markup rules for 3 and N dimensional arrays.

From the docs:

You can create multidimensional arrays by nesting pairs of square brackets, where the name of the base type of the elements is contained in the innermost pair of square brackets. For example, you can create a three-dimensional array of integers using three sets of square brackets:

``````var array3D: [[[Int]]] = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
``````

When accessing the elements in a multidimensional array, the left-most subscript index refers to the element at that index in the outermost array. The next subscript index to the right refers to the element at that index in the array thatâ€™s nested one level in. And so on. This means that in the example above, array3D[0] refers to [[1, 2], [3, 4]], array3D[0][1] refers to [3, 4], and array3D[0][1][1] refers to the value 4.

#### Two-dimensional array in Swift

Make it Generic 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])
``````