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
}


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow