Swift에서 switch 구문은 각 케잇의 맨 아래에서 다음 케이스로 넘어가지 않습니다. 만약 C언어에서처럼 다음 케이스로 넘어가려면 fallthrough
키워드를 사용하면 됩니다.
let integerToDescribe = 5
var description = "The number \(integerToDescribe) is"
switch integerToDescribe {
case 2, 3, 5, 7, 11, 13, 17, 19:
description += " a prime number, and also"
fallthrough
default:
description += " an integer."
}
print(description)
// Prints "The number 5 is a prime number, and also an integer."
defer의 뜻은 미루다, 연기하다 라는 뜻을 가지고 있습니다. 따라서 말 그대로 함수 내에서 자신의 실행을 맨 마지막으로 미루는 역할을 합니다.
아래는 공식 문서에 작성되어 있는 예제입니다.
var score = 3
if score < 100 {
score += 100
defer {
score -= 100
}
// Other code that uses the score with its bonus goes here.
print(score)
}
// Prints "103"
위 예제에서는 defer은 if 구문 내에서 실행 마지막으로 미뤘기 때문에 -100이 된 값이 출력되지 않고 103이 출력된 것을 확인할 수 있습니다. 여기서 if 바깥에 score을 출력해 보면 3이 출력되는 것을 확인할 수 있습니다.
var score = 3
if score < 100 {
score += 100
defer {
score -= 100
}
// Other code that uses the score with its bonus goes here.
print(score) // Prints "103"
}
print(score) // prints "3"
마지막으로 실행이 밀린 defer이 실행된 후 if 구문이 종료되었기 때문입니다.
if score < 10 {
defer {
print(score)
}
defer {
print("The score is:")
}
score += 5
}
// Prints "The score is:"
// Prints "6"
stack으로 쌓인다고 생각하면 되는데, 첫번째 defer가 스택에 쌓이고 나머지 defer가 스택에 쌓이면 두번째로 쌓인 defer가 실행되고 첫번째 defer가 실행되는 구조입니다.
참고한 블로그를 보면 NSLock을 이용해 상호배제를 걸 때 함수가 종료되기 전에 Lock이 걸린 경우 이 Lock을 풀어주어야 데드락에 걸리지 않는데 이러한 경우에 사용된다고 합니다.
let myLock: NSLock = .init()
func fetchData() {
myLock.lock()
defer { myLock.unlock() }
if data == nil { return }
//이후 작업 ~.~
}
아직 NSLock을 사용할 경우가 없어 현재로써는 쓸 일이 없어 보이지만 알고 있다면 나중에 유용할 듯 싶습니다.
또한 SQLite3을 사용할 때도 defer를 사용해 함수가 종료될 때 DB를 닫아주는 경우에도 사용된다고 합니다.
출처
https://babbab2.tistory.com/80
https://bbiguduk.gitbook.io/swift/language-guide-1/control-flow