Swift Language
Oświadczenie o odroczeniu
Szukaj…
Kiedy stosować instrukcję odroczenia
Instrukcja defer
składa się z bloku kodu, który zostanie wykonany po powrocie funkcji i powinien zostać użyty do czyszczenia.
Jak Swifta guard
oświadczenia zachęcić stylu wczesnego powrotu, może istnieć wiele możliwych ścieżek dla powrotu. Instrukcja defer
zapewnia kod czyszczenia, który nie musi być powtarzany za każdym razem.
Może także zaoszczędzić czas podczas debugowania i profilowania, ponieważ można uniknąć wycieków pamięci i nieużywanych otwartych zasobów z powodu zapomnianego czyszczenia.
Można go użyć do zwolnienia bufora na końcu funkcji:
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.
Można go również użyć do zamknięcia zasobów na końcu funkcji:
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
Kiedy NIE należy używać instrukcji odroczenia
Korzystając z instrukcji odroczenia, upewnij się, że kod jest czytelny, a kolejność wykonywania jest jasna. Na przykład następujące użycie instrukcji odroczenia sprawia, że kolejność wykonywania i funkcja kodu są trudne do zrozumienia.
postfix func ++ (inout value: Int) -> Int {
defer { value += 1 } // do NOT do this!
return value
}