Ich bin so verwirrt über 2D-Arrays in Swift. Lassen Sie mich Schritt für Schritt beschreiben. Und würden Sie mich bitte korrigieren, wenn ich falsch liege?
Zuerst; Deklaration eines leeren Arrays:
class test{
var my2Darr = Int[][]()
}
Zweitens füllen Sie das Array. (z. B. my2Darr[i][j] = 0
wo i, j for-Schleifenvariablen sind)
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? */
}
}
}
}
Und schließlich das Element Bearbeiten im Array
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))
Und Sie sollten wirklich auf eine neuere Beta upgraden.Int[][]()
ist keine gültige Syntax mehr. Es wurde geändert in[[Int]]()
.Antworten:
Definieren Sie ein veränderliches Array
ODER:
ODER wenn Sie ein Array mit vordefinierter Größe benötigen (wie von @ 0x7fffffff in den Kommentaren erwähnt):
Element an Position ändern
ODER
Unterarray ändern
ODER
ODER
Wenn Sie vor diesen Änderungen ein 3x2-Array mit 0 (Nullen) hatten, haben Sie jetzt:
Beachten Sie also, dass Sub-Arrays veränderbar sind und Sie das ursprüngliche Array, das die Matrix darstellt, neu definieren können.
Untersuchen Sie Größe / Grenzen vor dem Zugriff
Anmerkungen: Gleiche Markup-Regeln für 3- und N-dimensionale Arrays.
quelle
arr
wie in der Antwort definiert haben ,myVar
sollte dann Int sein, oder?var arr = Int(repeating: Int(repeating: 0, count: 2), count: 3)
var arr = Array(count: 2, repeatedValue: Array(count: 3, repeatedValue: 0))
Aus den Dokumenten:
Sie können mehrdimensionale Arrays erstellen, indem Sie Paare eckiger Klammern verschachteln, wobei der Name des Basistyps der Elemente im innersten Paar eckiger Klammern enthalten ist. Sie können beispielsweise ein dreidimensionales Array von Ganzzahlen mit drei Sätzen eckiger Klammern erstellen:
Beim Zugriff auf die Elemente in einem mehrdimensionalen Array bezieht sich der Index ganz links auf das Element an diesem Index im äußersten Array. Der nächste tiefgestellte Index rechts bezieht sich auf das Element an diesem Index in dem Array, in dem eine Ebene verschachtelt ist. Und so weiter. Dies bedeutet, dass sich Array3D [0] im obigen Beispiel auf [[1, 2], [3, 4]], Array3D [0] [1] auf [3, 4] und Array3D [0] [1] bezieht ] [1] bezieht sich auf den Wert 4.
quelle
Machen Sie es generisch schnell 4
quelle
Sie sollten vorsichtig sein, wenn Sie verwenden
Array(repeating: Array(repeating: {value}, count: 80), count: 24)
.Wenn der Wert ein Objekt ist, das von initialisiert wird
MyClass()
, verwenden sie dieselbe Referenz.Array(repeating: Array(repeating: MyClass(), count: 80), count: 24)
erstellt nichtMyClass
in jedem Array-Element eine neue Instanz von . Diese Methode wird nurMyClass
einmal erstellt und in das Array eingefügt.Hier ist eine sichere Möglichkeit, ein mehrdimensionales Array zu initialisieren.
quelle
Array(repeating: {value}, could 80)
mit geschweiften Klammern{value}
? Das würde eine Reihe von Verschlüssen schaffen, nicht wahr?{value}
Meta-Notation für "einen Wert vom Typ AnyObject" (ein Referenztyp)?In Swift 4
quelle
Laut Apple-Dokumenten für Swift 4.1 können Sie diese Struktur so einfach verwenden, um ein 2D-Array zu erstellen:
Link: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Subscripts.html
Codebeispiel:
quelle
Array(repeating:count:)
. Siehe den Kommentar, den ich zu Ihrer anderen Antwort gepostet habe.Berücksichtigen Sie vor der Verwendung mehrdimensionaler Arrays in Swift deren Auswirkungen auf die Leistung . In meinen Tests schnitt das abgeflachte Array fast zweimal besser ab als die 2D-Version:
Durchschnittliche Ausführungszeit zum Auffüllen eines 50x50-Arrays: 82,9 ms
vs.
Durchschnittliche Ausführungszeit zum Auffüllen eines 50x50 2D-Arrays: 135 ms
Beide Algorithmen sind O (n ^ 2), daher wird der Unterschied in den Ausführungszeiten durch die Art und Weise verursacht, wie wir die Tabelle initialisieren.
Das Schlimmste, was Sie tun können, ist
append()
, neue Elemente hinzuzufügen. Das war das langsamste in meinen Tests:Durchschnittliche Ausführungszeit zum Auffüllen eines 50x50-Arrays mit append (): 2,59 s
Fazit
Vermeiden Sie mehrdimensionale Arrays und verwenden Sie den Zugriff per Index, wenn die Ausführungsgeschwindigkeit von Bedeutung ist. 1D-Arrays sind leistungsfähiger, aber Ihr Code ist möglicherweise etwas schwieriger zu verstehen.
Sie können die Leistungstests selbst ausführen, nachdem Sie das Demo-Projekt von meinem GitHub-Repo heruntergeladen haben: https://github.com/nyisztor/swift-algorithms/tree/master/big-o-src/Big-O.playground
quelle
Dies kann in einer einfachen Zeile erfolgen.
Swift 5
Sie können es auch Instanzen einer Klasse oder Struktur Ihrer Wahl zuordnen
quelle