Swift Language
Утверждение Отсрочки
Поиск…
Когда использовать заявление о переносе
Оператор 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
}