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 |