Middle
Aký je rozdiel medzi kopírovaním poľa a štruktúr v Swift?
sobes.tech AI
Odpoveď od AI
Kopírovanie poľa v Swift vytvára novú nezávislú kópiu celého obsahu. Zmeny v pôvodnom poli neovplyvňujú skopírované a naopak.
Kopírovanie štruktúry v Swift tiež vytvára novú kópiu všetkých jej vlastností. Ak štruktúra obsahuje vnorené referenčné typy (napríklad triedy), kopíruje sa odkaz na tento objekt, nie samotný objekt. Zmeny v referenčnom type vnútri skopírovanej štruktúry sa prejavia aj v pôvodnej.
struct Point {
var x: Int
var y: Int
}
// Kopírovanie štruktúry
var point1 = Point(x: 10, y: 20)
var point2 = point1 // Kopírovanie štruktúry
point2.x = 30
print(point1.x) // Vypíše 10 (point1 sa nezmenil)
class Container {
var value: Int
init(value: Int) {
self.value = value
}
}
struct HasReference {
var data: Container
}
// Kopírovanie štruktúry s referenčným typom
var ref1 = HasReference(data: Container(value: 100))
var ref2 = ref1 // Kopírovanie štruktúry
ref2.data.value = 200 // Meniame referenčný typ vo vnútri štruktúry
print(ref1.data.value) // Vypíše 200 (zmena sa prejavila)
// Kopírovanie poľa (podľa hodnoty)
var array1 = [1, 2, 3]
var array2 = array1 // Kopírovanie poľa
array2[0] = 10
print(array1[0]) // Vypíše 1 (zmena v array2 neovplyvnila array1)
// Kopírovanie poľa obsahujúceho referenčné typy
var containers1 = [Container(value: 1), Container(value: 2)]
var containers2 = containers1 // Kopírovanie poľa (kopírujú sa odkazy)
containers2[0].value = 10 // Menieme cez odkaz v array2
print(containers1[0].value) // Vypíše 10 (zmena sa prejavila v array1)
| Funkcia | Pole | Štruktúra (bez referenčných vlastností) | Štruktúra (s referenčnými vlastnosťami) |
|---|---|---|---|
| Princíp kopírovania | Podľa hodnoty (shallow copy) | Podľa hodnoty | Podľa hodnoty (odkazy sa kopírujú) |
| Nezávislosť kópií | Nezávislé podľa obsahu | Nezávislé podľa všetkých vlastností | Nezávislé podľa vlastností-hodnôt, závislé od referenčných vlastností |
| Hlboké kopírovanie | Vyžaduje explicitnú implementáciu | Prirodzené | Vyžaduje explicitnú implementáciu pre referenčné vlastnosti |