Ricerca…


Quando utilizzare una dichiarazione di differimento

Una dichiarazione di defer costituita da un blocco di codice, che verrà eseguito quando una funzione ritorna e dovrebbe essere utilizzata per la pulizia.

Poiché le dichiarazioni di guard di Swift incoraggiano uno stile di ritorno anticipato, possono esistere molti possibili percorsi per un ritorno. Una dichiarazione di defer fornisce il codice di pulizia, che non deve essere ripetuto ogni volta.

Può anche risparmiare tempo durante il debugging e il profiling, poiché è possibile evitare perdite di memoria e risorse aperte non utilizzate a causa di una pulizia dimenticata.

Può essere usato per deallocare un buffer alla fine di una funzione:

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.

Può anche essere usato per chiudere le risorse alla fine di una funzione:

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

Quando NON usare una dichiarazione di differimento

Quando si utilizza una dichiarazione di differimento, assicurarsi che il codice rimanga leggibile e che l'ordine di esecuzione rimanga chiaro. Ad esempio, il seguente uso dell'istruzione differimento rende l'ordine di esecuzione e la funzione del codice difficili da comprendere.

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow