Tableau bidimensionnel dans Swift

Je suis tellement confus au sujet des tableaux 2D dans Swift. Laissez-moi vous 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[][]() } 

Remplissez ensuite le tableau. (comme my2Darr[i][j] = 0 où i, j sont des variables pour boucle)

 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 du 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) { ... } */ } } 

Définir un tableau mutable

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

Changer d’élément à la position

 arr[0][1] = 18 

OU

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

Changer de tableau

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

OU

 arr[0] += 234 

OU

 arr[0] += [345, 678] 

Si vous aviez un tableau 3×2 de 0 (zéro) 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 qui représente la masortingce.

Examiner la taille / les limites avant l’access

 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 de dimensions 3 et N.

De la documentation:

Vous pouvez créer des tableaux multidimensionnels en imbriquant des paires de crochets, où le nom du type de base des éléments est contenu dans la paire de crochets la plus interne. Par exemple, vous pouvez créer un tableau d’entiers en trois dimensions en utilisant trois ensembles de crochets:

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

Lors de l’access aux éléments d’un tableau multidimensionnel, l’index de l’indice le plus à gauche fait référence à l’élément situé à cet index dans le tableau le plus à l’extérieur. Le prochain index d’index à droite fait référence à l’élément situé à cet index dans le tableau nested à un niveau. 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] fait référence à la valeur 4.

Vous devriez faire attention quand vous utilisez Array(repeating: Array(repeating: {value}, count: 80), count: 24) .

Si la valeur est un object 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 ne crée qu’une MyClass fois MyClass et la place dans le tableau.

Voici un moyen sûr d’initialiser un tableau multidimensionnel.

 private var masortingx: [[MyClass]] = MyClass.newMasortingx() private static func newMasortingx() -> [[MyClass]] { var masortingx: [[MyClass]] = [] for i in 0...23 { masortingx.append( [] ) for _ in 0...79 { masortingx[i].append( MyClass() ) } } return masortingx } 

Selon les documents Apple pour swift 4.1, vous pouvez utiliser cette structure si facilement pour créer un tableau 2D:

Lien: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Subscripts.html

Échantillon de code:

 struct Masortingx { 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 } } 

}

Dans Swift 4

 var arr = Array(repeating: Array(repeating: 0, count: 2), count: 3) // [[0, 0], [0, 0], [0, 0]]