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