Je suis tellement confus à propos des tableaux 2D dans Swift. Laissez-moi vous décrire étape par étape. Et pourriez-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 de boucle 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? */
}
}
}
}
Et enfin, modification de l'élément 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) { ... } */
}
}
var my2DArray = Array(count: 10, repeatedValue: Array(count: 10, repeatedValue: 18))
et vous devriez vraiment passer à une version bêta plus récente.Int[][]()
n'est plus une syntaxe valide. Il a été changé en[[Int]]()
.Réponses:
Définir un tableau mutable
OU:
OU si vous avez besoin d'un tableau de taille prédéfinie (comme mentionné par @ 0x7fffffff dans les commentaires):
Changer d'élément à la position
OU
Changer le sous-tableau
OU
OU
Si vous aviez un tableau 3x2 de 0 (zéros) avant ces changements, vous avez maintenant:
Sachez donc que les sous-tableaux sont mutables et que vous pouvez redéfinir le tableau initial qui représentait la matrice.
Examiner la taille / les limites avant l'accès
Remarques: mêmes règles de balisage pour les tableaux à 3 et N dimensions.
la source
arr
défini comme dans la réponse, alorsmyVar
devrait être Int, n'est-ce pas?var arr = Int(repeating: Int(repeating: 0, count: 2), count: 3)
var arr = Array(count: 2, repeatedValue: Array(count: 3, repeatedValue: 0))
À partir 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 la plus interne de crochets. Par exemple, vous pouvez créer un tableau tridimensionnel d'entiers à l'aide de trois ensembles de crochets:
Lors de l'accès aux éléments d'un tableau multidimensionnel, l'index d'indice le plus à gauche fait référence à l'élément à cet index dans le tableau le plus à l'extérieur. L'index d'indice suivant à droite fait référence à l'élément à cet index dans le tableau qui est imbriqué à 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.
la source
Rendez-le générique Swift 4
la source
Vous devez être prudent 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 deMyClass
dans chaque élément du tableau. Cette méthode ne créeMyClass
qu'une seule fois et la place dans le tableau.Voici un moyen sûr d'initialiser un tableau multidimensionnel.
la source
Array(repeating: {value}, could 80)
avec des accolades{value}
? Cela créerait une série de fermetures, n'est-ce pas?{value}
méta-notation pour "une valeur de type AnyObject" (un type de référence)?Dans Swift 4
la source
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
Exemple de code:
la source
Array(repeating:count:)
. Voir le commentaire que j'ai publié sur votre autre réponse.Avant d'utiliser des tableaux multidimensionnels dans Swift, considérez leur impact sur les performances . Dans mes tests, le tableau aplati a fonctionné presque 2x mieux que la version 2D:
Temps d'exécution moyen pour remplir une baie 50x50: 82,9 ms
contre.
Temps d'exécution moyen pour remplir une matrice 2D 50x50: 135 ms
Les deux algorithmes sont O (n ^ 2), donc la différence des temps d'exécution est causée par la façon dont nous initialisons la table.
Enfin, le pire que vous puissiez faire est d'utiliser
append()
pour ajouter de nouveaux éléments. Cela s'est avéré être le plus lent de mes tests:Temps d'exécution moyen pour remplir un tableau 50x50 avec append (): 2,59 s
Conclusion
Évitez les tableaux multidimensionnels et utilisez l'accès par index si la vitesse d'exécution compte. Les tableaux 1D sont plus performants, mais votre code peut être un peu plus difficile à comprendre.
Vous pouvez exécuter les tests de performances vous-même après avoir téléchargé le projet de démonstration depuis mon dépôt GitHub: https://github.com/nyisztor/swift-algorithms/tree/master/big-o-src/Big-O.playground
la source
Cela peut être fait en une seule ligne.
Swift 5
Vous pouvez également le mapper à des instances de n'importe quelle classe ou structure de votre choix
la source