Swift Language
Blocks
Sök…
Introduktion
Från Swift Documentarion
En stängning sägs undkomma en funktion när stängningen överförs som ett argument till funktionen, men kallas efter att funktionen återgår. När du förklarar en funktion som tar en stängning som en av dess parametrar kan du skriva @escaping innan parametertypen för att indikera att stängningen får fly.
Icke-undkommande stängning
I Swift 1 och 2 flydde stängningsparametrarna som standard. Om du visste att din stängning inte skulle undgå funktionskroppen kan du markera parametern med attributet @noescape.
I Swift 3 är det tvärtom: stängningsparametrar undviker som standard. Om du tänker att den ska undgå funktionen måste du markera den med attributet @escaping.
class ClassOne {
// @noescape is applied here as default
func methodOne(completion: () -> Void) {
//
}
}
class ClassTwo {
let obj = ClassOne()
var greeting = "Hello, World!"
func methodTwo() {
obj.methodOne() {
// self.greeting is required
print(greeting)
}
}
}
Rymmer stängning
Från Swift Documentarion
@escaping
Tillämpa detta attribut på en parametertyp i en metod eller funktionsdeklaration för att indikera att parameterns värde kan lagras för senare exekvering. Detta innebär att värdet tillåts överleva samtalets livstid. Parametrar för funktionstyp med attributet för undkommande typ kräver uttrycklig användning av jaget. för egenskaper eller metoder.
class ClassThree {
var closure: (() -> ())?
func doSomething(completion: @escaping () -> ()) {
closure = finishBlock
}
}
I exemplet ovan sparas kompletteringsblocket för att stängas och kommer bokstavligen att leva bortom funktionssamtalet. Så kompliseraren kommer att tvinga att markera slutföringsblocket som @escaping.