Kas ir slēgšana?
sobes.tech AI
Atbilde no AI
Aizvērums (closure) Swift valodā ir pašpietiekams funkcionalitātes bloks ({}), kuru var nodot un izmantot kodā. Aizvērumi var aizķert un saglabāt atsauces uz jebkuriem konstantiem un mainīgajiem no konteksta, kurā tie ir definēti.
Piemēri izmantošanai:
- Kā funkciju argumenti (piemēram, Completion Handlers).
- Kolekciju iterācijas uzvedības definēšanai (piemēram, izmantojot
map,filter,reduce,sortedmetodes). - Koda atliktai izpildei.
Sintakse:
// Pamat sintakse
{ (parametri) -> atgriešanasTips in
izteiksmes
}
// Aizvēruma piemērs, kas pieņem Int un atgriež String
let integerToString: (Int) -> String = { (number: Int) -> String in
return "Skaitlis: \(number)"
}
Īpašības:
- Automātiska mainīgo aizķeršana (capturing values).
- Iespēja definēt aizvērumus bez skaidras parametru un atgriešanas vērtības tipa norādes (sintaktiskais cukurs).
- Saīsinātu parametru nosaukumu izmantošana ($0, $1 un tā tālāk).
- Aizvēruma sintakse (trailing closure syntax).
Aizķeršanas saraksti:
Aizvērums var aizķert mainīgos no savas vides. Pēc noklusējuma aizķeršana notiek pēc atsauces. Ja aizvērums tiek izmantots pēc tam, kad sākotnējais mainīgais ir izbeidzis savu darbību, aizvērums joprojām saglabā piekļuvi tam.
func makeIncrementer(forIncrement amount: Int) -> () -> Int {
var runningTotal = 0 // Vides mainīgais
let incrementer: () -> Int = { // Aizvērums
runningTotal += amount // Aizķer runningTotal un amount
return runningTotal
}
return incrementer
}
let incrementByTen = makeIncrementer(forIncrement: 10)
print(incrementByTen()) // Izvade: 10
print(incrementByTen()) // Izvade: 20
Aizķeršanas saraksti (Capture Lists):
Tie tiek izmantoti, lai skaidri norādītu, kā mainīgie ir jāaizķer - pēc vērtības vai pēc atsauces, kā arī lai izvairītos no stipriem atsauces cikliem (retain cycles).
class MyClass {
var value = 0
lazy var myClosure: () -> Void = { [self, value] in // Aizķer self pēc atsauces, value pēc vērtības
print("self.value vērtība: \(self.value)")
print("Aizķertā vērtība: \(value)")
}
deinit {
print("MyClass instances ir atbrīvots")
}
}
Lai novērstu stiprus atsauces ciklus, izmanto [weak self] vai [unowned self]:
class ViewController {
var dataFetcher: DataFetcher?
func fetchData() {
dataFetcher?.fetch { [weak self] result in // vājš atsauce uz self
guard let self = self else { return } // pārbaude, vai self pastāv
// rezultāta apstrāde
}
}
}
class DataFetcher {
var completionHandler: ((Result<String, Error>) -> Void)?
func fetch(completion: @escaping (Result<String, Error>) -> Void) {
self.completionHandler = completion
// Asinhrona operācija...
}
}