Recherche…


Quand utiliser une déclaration différée

Une instruction de defer consiste en un bloc de code, qui sera exécuté lors du retour d'une fonction et qui devrait être utilisé pour le nettoyage.

Comme les déclarations de guard de Swift encouragent un style de retour précoce, de nombreux chemins possibles pour un retour peuvent exister. Une defer déclaration fournit le code de nettoyage, qui ne puis pas besoin d'être répété à chaque fois.

Il peut également gagner du temps lors du débogage et du profilage, car les fuites de mémoire et les ressources ouvertes non utilisées en raison d'un nettoyage oublié peuvent être évitées.

Il peut être utilisé pour désallouer un tampon à la fin d'une fonction:

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.

Il peut également être utilisé pour fermer des ressources à la fin d'une fonction:

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

Quand ne pas utiliser une déclaration différée

Lorsque vous utilisez une instruction de report, assurez-vous que le code reste lisible et que l'ordre d'exécution reste clair. Par exemple, l'utilisation suivante de l'instruction defer rend l'ordre d'exécution et la fonction du code difficiles à comprendre.

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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow