Junior — Middle
Kaip uždarymas sąveikauja su struktūros pavyzdžiu programavimo kalboje?
sobes.tech AI
Atsakymas iš AI
Swift struktūros yra reikšmių tipai, tai yra, perduodant ar priskiriant, sukuriama kopija išrašo. Uždarymai, kurie įsikimba išorinį kontekstą kintamuosius, gali sąveikauti su struktūros pavyzdžiu, tačiau svarbu suprasti, kad jie įsikimba kopijas reikšmių, o ne patį pavyzdį.
Jei uždarymas įsikimba struktūros savybę, jis įsikimba jos dabartinę reikšmę, o ne nuorodą į originalą. Todėl pakeitimai uždarymo viduje nepaveiks pirminio struktūros pavyzdžio, išskyrus atvejus, kai uždarymas pažymėtas kaip @escaping ir dirba su inout parametrais ar nuorodomis.
Pavyzdys:
struct Counter {
var count = 0
mutating func incrementer() -> () -> Void {
return { [self] in
print("Count is \(count)")
}
}
}
var counter = Counter()
let closure = counter.incrementer()
counter.count = 10
closure() // Išves "Count is 0", nes uždarymas įsikimba kopiją self
Kad uždarymas galėtų keisti struktūros būseną, reikia naudoti inout arba dirbti su klasėmis (nuorodų tipais).