-
Swift Tips & Tricks - deferSwift/Tips & Tricks 2021. 9. 14. 13:36
Swift 에 defer 라는 keyword 가 있다.
사전적 의미는 연기하다,
Xcode 내 의미는
Excutes a set of statements before execution leaves the current block of code.
즉, defer 가 속해있는 block 이 나가기 전에
(block 이 끝 라인까지 읽혀서 끝나거나, 중간에 guard let 등으로 코드를 벗어나게 될 때) 실행된다.
아래는 youtube 에서 가져온 예제 소스이다.
func useFile() { let file = try! FileHandle(forReadingFrom: URL(string: "~/temp.txt")!) guard let data = try? file.readToEnd() else { return } // use this data // write to the file file.closeFile() }
(적절한 try catch 처리는 하지 않았다. 현재 콘텐츠의 요점이 아니기때문에)
useFile 함수에서 어떤 file 을 가져온 후, 끝까지 읽고 data를 이용 , 그 후 file 을 닫는 로직이다.
file 을 열고 조작한 후에는 반드시 파일을 닫고 (closeFile()) 끝내야 하는데, 이 과정중에 에러가 생겨 early exit 될 수도 있다.
(guard let 에서 걸리거나 등등)
이런 경우 file.closeFile() 이 실행되지 못한 채 함수블록이 종료되기 때문에 문제가 생긴다.
이를 방지하기 위해서
func useFile() { let file = try! FileHandle(forReadingFrom: URL(string: "~/temp.txt")!) guard let data = try? file.readToEnd() else { file.closeFile() return } // use this data // write to the file file.closeFile() }
다음과 같이 처리할 수도 있겠지만, 위 예제는 단순한 경우라서 guard let 구문이 하나이고, 이 외에도 많은 early exit 의 경우가 생길 수 있다.
모든 early exit 마다 closeFile 을 선언한다면 코드의 질이 떨어지고, 다른 문제가 생길수도 있다.
따라서 이때 defer 를 사용하면 이를 방지할 수 있다.
func useFile() { let file = try! FileHandle(forReadingFrom: URL(string: "~/temp.txt")!) defer{ file.closeFile()} guard let data = try? file.readToEnd() else { return } // use this data // write to the file }
해당 코드에서 file 이 정상적으로 열린경우 defer 내 구문이 바로 실행되지 않고 블록이 종료되기 전에 한번 실행되어
파일이 열린 채 끝나지 않는 다는 것을 보장할 수 있고,
코드의 질 또한 좋아질 수 있다.
'Swift > Tips & Tricks' 카테고리의 다른 글
Swift 개발 / 배포 코드 다르게 하기 (if DEBUG) (0) 2022.04.08 Rx Swift Cocoa pods 로 설치하기, playground 연습 환경 구축 (0) 2022.03.23 Swift Tips and Tricks - .enumerated() (0) 2021.10.12 Swift Tips & Tricks) Pattern matching operator ~= (0) 2021.10.12 Swift Language) sort, map, filter, reduce (0) 2021.09.29