수색…


지연 명령문을 사용하는 경우

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-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