Jaka jest różnica między kopiowaniem tablicy a kopiowaniem struktury w języku Swift?
sobes.tech AI
Odpowiedź od AI
Skopiowana struktura to nowa niezależna instancja. Zmiany w jednej strukturze nie wpływają na drugą.
Kopiowanie tablicy (Array) w Swift domyślnie odbywa się jako "kopiowanie przy zapisie" (copy-on-write). Oznacza to, że podczas tworzenia nowego odwołania do tablicy dane nie są duplikowane, dopóki jedna z kopii nie zostanie zmieniona. Do tego momentu obie zmienne odwołują się do tych samych elementów w pamięci. Gdy jedna z kopii zostanie zmieniona, tworzona jest nowa niezależna instancja danych.
struct Point {
var x: Int
var y: Int
}
var p1 = Point(x: 1, y: 2)
var p2 = p1 // Kopiowanie struktury. p2 to nowa instancja
p2.x = 10 // Zmiana p2 nie wpływa na p1
print("p1: \(p1.x), \(p1.y)") // Wydruk: p1: 1, 2
print("p2: \(p2.x), \(p2.y)") // Wydruk: p2: 10, 2
var array1 = [1, 2, 3]
var array2 = array1 // Kopiowanie przy zapisie
array2[0] = 10 // Dochodzi do faktycznego kopiowania danych
print("array1: \(array1)") // Wydruk: array1: [1, 2, 3]
print("array2: \(array2)") // Wydruk: array2: [10, 2, 3]
Różnica polega na fundamentalnym zachowaniu: struktury zawsze są kopiowane według wartości, podczas gdy tablice, będąc strukturami, implementują optymalizację "copy-on-write" dla bardziej efektywnego zarządzania pamięcią przy wielu odwołaniach.