Поиск…


Когда использовать заявление о переносе

Оператор defer состоит из блока кода, который будет выполняться при возврате функции и должен использоваться для очистки.

Как Свифт guard заявления поощряют стиль раннего возвращения, много возможных путей для возвращения могут существовать. Оператор defer предоставляет код очистки, который затем не нужно повторять каждый раз.

Он также может сэкономить время при отладке и профилировании, поскольку можно избежать утечек памяти и неиспользуемых открытых ресурсов из-за забытой очистки.

Его можно использовать для освобождения буфера в конце функции:

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.

Он также может использоваться для закрытия ресурсов в конце функции:

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

Когда НЕ использовать оператор отсрочки

При использовании инструкции defer-оператора убедитесь, что код остается читаемым, и порядок выполнения остается ясным. Например, следующее использование оператора defer-statement делает порядок выполнения и функцию кода трудно понять.

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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow