Middle
Kuo skiriasi masyvo ir struktūrų kopijavimas Swift?
sobes.tech AI
Atsakymas iš AI
Swift masyvas kopijuoja naują nepriklausomą viso turinio kopiją. Pakeitimai pirminėje masyve neįtakoja kopijuoto ir atvirkščiai.
Swift struktūros kopijavimas taip pat sukuria naują visų jos savybių kopiją. Jei struktūra turi įdėtus nuorodinius tipus (pvz., klases), kopijuojama nuoroda į tą objektą, o ne pats objektas. Pakeitimai nuorodiniame tipe viduje atsispindi ir pirminėje struktūroje.
struct Point {
var x: Int
var y: Int
}
// Struktūros kopijavimas
var point1 = Point(x: 10, y: 20)
var point2 = point1 // Struktūros kopijavimas
point2.x = 30
print(point1.x) // Išves 10 (point1 nepasikeitė)
class Container {
var value: Int
init(value: Int) {
self.value = value
}
}
struct HasReference {
var data: Container
}
// Struktūros kopijavimas su nuorodiniu tipu
var ref1 = HasReference(data: Container(value: 100))
var ref2 = ref1 // Struktūros kopijavimas
ref2.data.value = 200 // Keičiamas nuorodinis tipas viduje struktūros
print(ref1.data.value) // Išves 200 (pasikeitimas atsispindėjo)
// Masivo kopijavimas (pagal reikšmę)
var array1 = [1, 2, 3]
var array2 = array1 // Masivo kopijavimas
array2[0] = 10
print(array1[0]) // Išves 1 (pakeitimas array2 nepaveikė array1)
// Masivo kopijavimas, turintis nuorodinius tipus
var containers1 = [Container(value: 1), Container(value: 2)]
var containers2 = containers1 // Masivo kopijavimas (nuorodos kopijuojamos)
containers2[0].value = 10 // Keičiamas per nuorodą array2
print(containers1[0].value) // Išves 10 (pakeitimas atsispindėjo ir array1)
| Ypatybė | Masivas | Struktūra (be nuorodinių savybių) | Struktūra (su nuorodinėmis savybėmis) |
|---|---|---|---|
| Kopijavimo principas | Pagal reikšmę (shallow copy) | Pagal reikšmę | Pagal reikšmę (nuorodos kopijuojamos) |
| Nepriklausomybė kopijų | Nepriklausomos pagal turinį | Nepriklausomos pagal visas savybes | Nepriklausomos pagal savybių reikšmes, priklausomos nuo nuorodinių savybių |
| Giliai kopijavimas | Reikalauja aiškios realizacijos | Natūraliai | Reikalauja aiškios realizacijos nuorodinių savybių |