Je suis tellement confus à propos des tableaux 2D dans Swift. Permettez-moi de décrire étape par étape. Et voudriez-vous me corriger si je me trompe?.
Tout d'abord; déclaration d'un tableau vide:
class test{
var my2Darr = Int[][]()
}
Deuxièmement, remplissez le tableau. (comme my2Darr[i][j] = 0
où i, j sont des variables for-loop)
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? */
}
}
}
}
Et enfin, élément d'édition de dans tableau
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]]()
OU:
// 2 dimensional array of arrays of Ints
var arr: [[Int]] = []
OU si vous avez besoin d'un tableau de taille prédéfinie (comme mentionné par @ 0x7fffffff dans les commentaires):
// 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]
Si vous aviez un tableau 3x2 de 0(zeros) avant ces modifications, vous avez maintenant:
[
[0, 0, 234, 345, 678], // 5 elements!
[123, 456, 789],
[0, 0]
]
Sachez donc que les sous-tableaux sont mutables et que vous pouvez redéfinir le tableau initial représentant la matrice.
let a = 0
let b = 1
if arr.count > a && arr[a].count > b {
println(arr[a][b])
}
Remarques: Mêmes règles de balisage pour les tableaux à 3 et N dimensions.
De la docs:
Vous pouvez créer des tableaux multidimensionnels en imbriquant des paires de crochets, le nom du type de base des éléments étant contenu dans la paire de crochets la plus intérieure. Par exemple, vous pouvez créer un tableau à trois dimensions d’entiers en utilisant trois jeux de crochets:
var array3D: [[[Int]]] = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
Lors de l'accès aux éléments d'un tableau multidimensionnel, l'index en indice le plus à gauche fait référence à l'élément situé à cet index dans le tableau le plus à l'extérieur. L’indice d’indice suivant à droite fait référence à l’élément de cet index dans le tableau où un niveau est imbriqué. Et ainsi de suite. Cela signifie que dans l'exemple ci-dessus, array3D [0] fait référence à [[1, 2], [3, 4]], array3D [0] [1] fait référence à [3, 4] et array3D [0] [1 ] [1] se réfère à la valeur 4.
Vous devez faire attention lorsque vous utilisez Array(repeating: Array(repeating: {value}, count: 80), count: 24)
.
Si la valeur est un objet, qui est initialisé par MyClass()
, ils utiliseront la même référence.
Array(repeating: Array(repeating: MyClass(), count: 80), count: 24)
ne crée pas une nouvelle instance de MyClass
dans chaque élément du tableau. Cette méthode crée seulement MyClass
une fois et le place dans le tableau.
Voici un moyen sûr d'initialiser un tableau multidimensionnel.
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
}
Dans Swift 4
var arr = Array(repeating: Array(repeating: 0, count: 2), count: 3)
// [[0, 0], [0, 0], [0, 0]]
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])
Selon Apple documents pour Swift 4.1, vous pouvez utiliser cette structure aussi facilement pour créer un tableau 2D:
Exemple de code:
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
}
}
}