Buscar..


Cuándo usar una declaración diferida

Una declaración defer consiste en un bloque de código, que se ejecutará cuando una función regrese y se debe usar para la limpieza.

Como las declaraciones de los guard de Swift fomentan un estilo de retorno temprano, pueden existir muchos caminos posibles para un retorno. Una declaración defer proporciona un código de limpieza, que luego no necesita repetirse cada vez.

También puede ahorrar tiempo durante la depuración y la creación de perfiles, ya que se pueden evitar las pérdidas de memoria y los recursos abiertos no utilizados debido a una limpieza olvidada.

Se puede usar para desasignar un búfer al final de una función:

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.

También se puede usar para cerrar recursos al final de una función:

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

Cuando NO usar una declaración diferida

Cuando use una declaración diferida, asegúrese de que el código se mantenga legible y que el orden de ejecución quede claro. Por ejemplo, el siguiente uso de la declaración diferida hace que el orden de ejecución y la función del código sean difíciles de comprender.

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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow