크게 다가온 defer 구문#
Apple의 Swift2 메뉴얼의 Error Handling에서 짧게 설명한 defer 구문. 설명은 얼마 안 되었지만 크게 다가왔다. 정리 작업 처리 코드 작성을 상당히 편하게 만들어 줄 수 있을 것으로 보였기 때문이다.
정리 작업을 하는 경우#
어떤 작업을 하기 위해 준비 작업과, 정리 작업을 하는 함수의 경우에 다음과 같은 형태로 작성될 것이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| boolean f()
{
a()
b()
do1()
if something is fail {
~b()
~a()
return false
}
do2()
~b()
~a()
return true
}
|
작업 중간에 함수를 빠져나가게 될 경우, 정리 작업을 해줘야 한다.
defer를 사용 시#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| boolean f() {
a()
defer {
~a()
}
b()
defer {
~b()
}
do1()
if something is fail {
return false
}
do2()
return true
}
|
함수를 빠져나갈 때, 정리 작업을 하게 된다.
defer가 수행되는 시점#
참고로 defer 구문이 수행되는 시점은 defer 구문이 속한 Scope을 벗어날 때이다. 즉, 함수 단위가 아닌 그보다 작은 단위라 할 수 있다. Apple 매뉴얼의 예제를 보면 그 부분을 바로 설명하고 있다. 다음은 그 예를 그대로 가지고 왔다.
1
2
3
4
5
6
7
8
9
10
11
12
| func processFile(filename: String) throws {
if exists(filename) {
let file = open(filename)
defer {
close(file)
}
while let line = try file.readline() {
// Work with the file.
}
// close(file) is called here, at the end of the scope.
}
}
|