Sobes.tech
Middle

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.