2016-03-28 9 views
0

Ich habe in Swift ein wirklich merkwürdiges Verhalten gefunden. Hier ist der Code:Ändern von Array-Elementen in Swift

var array2d: [[Int]] = [[1]] 
print(array2d) // prints [[1]] 

var first = array2d[0] 
first.append(2) 

print(array2d) // still prints [[1]]!!! 

Ich würde total die letzte Zeile [[1, 2]] drucken erwarten. Ich kann das aktuelle Verhalten nicht erklären. Ich würde erwarten, array2d[0] einen Verweis auf das erste Element oder möglicherweise eine Kopie dieser Referenz zurückgeben. In jedem Fall sollte das Ändern dieses Objekts array2d ändern. Aber das passiert nicht.

Wenn jedoch aktualisiere ich das Array wie folgt aus:

array2d[0].append(2) 

es dann [[1, 2]] druckt, wie erwartet.

Kann mir bitte jemand das erklären?

Antwort

1

Wie Arrays referenziert/weitergegeben/in Swift kopiert werden, ist ein Punkt von vielen Konflikten, werfen Sie einen Blick auf this link.

Im Wesentlichen ist, was passiert ist, dass var first = array2d[0] eine Kopie des Array bei diesem Index im Gegensatz zu einem Erstellen einer Referenz, wie Sie erwartet wurden. Der Zugriff auf das Array mit der Indexnotation ermöglicht Ihnen daher, das Array korrekt zu ändern, das Erstellen einer neuen Variablen jedoch nicht.

+0

Mit anderen Worten, es macht eine tiefe Kopie von allem? – Macondo2Seattle