Sobes.tech
Middle

Kuo skiriasi masyvo kopijavimas nuo struktūros kopijavimo Swift programavimo kalboje?

sobes.tech AI

Atsakymas iš AI

Kopijuota struktūra yra nauja nepriklausoma egzempliorius. Pakeitimai vienoje struktūroje neturi įtakos kitai.

Swift kalboje masyvo (Array) kopijavimas pagal numatytuosius nustatymus vyksta kaip "copy-on-write" (kopijavimas rašymo metu). Tai reiškia, kad sukūrus naują nuorodą į masyvą, duomenys nėra dubliuojami, kol viena iš kopijų nėra pakeista. Iki to momento abi kintamosios nuoroda į tas pačias atminties elementus. Kai viena iš kopijų pakeičiama, sukuriamas naujas nepriklausomas duomenų egzempliorius.

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

var p1 = Point(x: 1, y: 2)
var p2 = p1 // Struktūros kopija. p2 yra naujas egzempliorius

p2.x = 10 // Pakeitimai p2 neveikia p1

print("p1: \(p1.x), \(p1.y)") // Išvestis: p1: 1, 2
print("p2: \(p2.x), \(p2.y)") // Išvestis: p2: 10, 2

var array1 = [1, 2, 3]
var array2 = array1 // Rašymo metu kopijavimas

array2[0] = 10 // Faktinis duomenų kopijavimas

print("array1: \(array1)") // Išvestis: array1: [1, 2, 3]
print("array2: \(array2)") // Išvestis: array2: [10, 2, 3]

Skirtumas slypi pagrindiniame elgesyje: struktūros visada kopijuojamos pagal reikšmę, o masyvai, būdami struktūromis, įgyvendina "copy-on-write" optimizaciją, leidžiančią efektyviau valdyti atmintį daugybėje nuorodų.