Sobes.tech
Middle

Jaka jest różnica między kopiowaniem tablicy a struktur w Swift?

sobes.tech AI

Odpowiedź od AI

Kopiowanie tablicy w Swift tworzy nową, niezależną kopię całej zawartości. Zmiany w oryginalnej tablicy nie wpływają na kopię i odwrotnie.

Kopiowanie struktury w Swift również tworzy nową kopię wszystkich jej właściwości. Jeśli struktura zawiera zagnieżdżone typy referencyjne (np. klasy), kopiowana jest referencja do tego obiektu, a nie sam obiekt. Zmiany w typie referencyjnym wewnątrz skopiowanej struktury odzwierciedlają się w oryginale.

struct Point {
    var x: Int
    var y: Int
}

// Kopiowanie struktury
var point1 = Point(x: 10, y: 20)
var point2 = point1 // Kopiowanie struktury
point2.x = 30
print(point1.x) // Wyświetli 10 (point1 się nie zmienił)

class Container {
    var value: Int
    init(value: Int) {
        self.value = value
    }
}

struct HasReference {
    var data: Container
}

// Kopiowanie struktury z typem referencyjnym
var ref1 = HasReference(data: Container(value: 100))
var ref2 = ref1 // Kopiowanie struktury
ref2.data.value = 200 // Zmieniamy typ referencyjny wewnątrz struktury
print(ref1.data.value) // Wyświetli 200 (zmiana odzwierciedlona)

// Kopiowanie tablicy (według wartości)
var array1 = [1, 2, 3]
var array2 = array1 // Kopiowanie tablicy
array2[0] = 10
print(array1[0]) // Wyświetli 1 (zmiana w array2 nie wpłynęła na array1)

// Kopiowanie tablicy zawierającej typy referencyjne
var containers1 = [Container(value: 1), Container(value: 2)]
var containers2 = containers1 // Kopiowanie tablicy (referencje są kopiowane)
containers2[0].value = 10 // Zmieniamy przez referencję w array2
print(containers1[0].value) // Wyświetli 10 (zmiana odzwierciedlona w array1)

Cecha Tablica Struktura (bez właściwości referencyjnych) Struktura (z właściwościami referencyjnymi)
Zasada kopiowania Po wartości (płytka kopia) Po wartości Po wartości (referencje są kopiowane)
Niezależność kopii Niezależne według zawartości Niezależne według wszystkich właściwości Niezależne według właściwości-wartości, zależne od właściwości referencyjnych
Kopia głęboka Wymaga jawnej implementacji Naturalnie Wymaga jawnej implementacji dla właściwości referencyjnych