Zoeken…


Wanneer een uitstelinstructie te gebruiken

Een defer bestaat uit een codeblok dat wordt uitgevoerd wanneer een functie terugkeert en moet worden gebruikt voor het opschonen.

Omdat de guard Swift een stijl van vroege terugkeer aanmoedigen, kunnen er vele mogelijke paden voor een terugkeer bestaan. Een defer biedt opschooncode, die dan niet elke keer hoeft te worden herhaald.

Het kan ook tijd besparen tijdens het debuggen en profileren, omdat geheugenlekken en ongebruikte open bronnen als gevolg van vergeten opschonen kunnen worden vermeden.

Het kan worden gebruikt om een buffer aan het einde van een functie toe te wijzen:

func doSomething() {
    let data = UnsafeMutablePointer<UInt8>(allocatingCapacity: 42)
    // this pointer would not be released when the function returns 
    // so we add a defer-statement
    defer {
        data.deallocateCapacity(42)
    }
    // it will be executed when the function returns.
    
    guard condition else { 
        return /* will execute defer-block */ 
    }
       
}   // The defer-block will also be executed on the end of the function.

Het kan ook worden gebruikt om bronnen aan het einde van een functie te sluiten:

func write(data: UnsafePointer<UInt8>, dataLength: Int) throws {
    var stream:NSOutputStream = getOutputStream()
    defer {
        stream.close()
    }

    let written = stream.write(data, maxLength: dataLength)
    guard written >= 0 else { 
        throw stream.streamError! /* will execute defer-block */ 
    }
    
}    // the defer-block will also be executed on the end of the function

Wanneer NIET een uitstelverklaring gebruiken

Let er bij het gebruik van een uitstelverklaring op dat de code leesbaar blijft en dat de uitvoeringsvolgorde duidelijk blijft. Het volgende gebruik van de uitstel-instructie maakt de uitvoeringsvolgorde en de functie van de code bijvoorbeeld moeilijk te begrijpen.

postfix func ++ (inout value: Int) -> Int {
    defer { value += 1 } // do NOT do this!
    return value
}


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow