როგორ ურთიერთქმედებს დახურვა პროგრამირების ენაში სტრუქტურის მაგალითთან?
sobes.tech AI
პასუხი AI-სგან
Swift-ში სტრუქტურები მნიშვნელობის ტიპებია, რაც ნიშნავს, რომ გადაცემის ან მინიჭების დროს ქმნიან ინстанციის კოპიას. დახურვები, რომლებიც იჭერენ გარედან კონტექსტიდან ცვლადებს, შეიძლება ურთიერთქმედონ სტრუქტურის ინстанციასთან, მაგრამ მნიშვნელოვანია להבין, რომ ისინი იჭერენ მნიშვნელობების კოპიებს, არა თავად ინстанციას.
თუ დახურვა იჭერს სტრუქტურის თვისებას, ის იჭერს მისი მიმდინარე მნიშვნელობას, არა ორიგინალზე მითითებას. შესაბამისად, ცვლილებები დახურვის შიგნით არ იმოქმედებს სტრუქტურის ორიგინალ ინстанციაზე, თუ მხოლოდ დახურვა არ არის მითითებული @escaping-ით და არ მუშაობს inout პარამეტრებთან ან მითითებებთან.
მაგალითი:
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() // გამოიტანს "Count is 0", რადგან დახურვა იჭერს self-ის კოპიას
იმისთვის, რომ დახურვა შეძლოს სტრუქტურის მდგომარეობის შეცვლა, საჭიროა გამოიყენოთ inout ან იმუშაოთ კლასებთან (შეთავაზების ტიპებთან).