web-dev-qa-db-fra.com

Tableau à deux dimensions dans Swift

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

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

OR

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

Changer de sous-tableau

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.

Examiner la taille/les limites avant l'accès

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.

188
Keenle

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.

26
Woodstock

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
}
13
Kimi Chiu

Dans Swift 4

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

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])
9
dimo hamdy

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

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

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
    }
}

}

9
Keyhan Kamangar