일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- xcode
- Failed to register bundle identifier
- SWIFT
- IOS
- roundingMode
- contentInset
- Codegen
- delegation
- View Life Cycle
- NumberFormatter
- mvvm
- NotificationCenter
- 독서후기
- Navigation
- Modality
- 책후기
- SWIFTUI
- 독후감
- Structures and Classes
- 아이폰
- UIResponder
- @available
- Info.plist
- 부트캠프
- 야곰아카데미
- Mock
- viewcontroller
- 스위프트
- 스타트업주니어로살아남기
- human interface guidelines
- Today
- Total
호댕의 iOS 개발
[Swift 기본 문법] 함수의 Scope가 종료되는 시점에 해야할 일을 정하고 싶다면? defer 문! 본문
[Swift 기본 문법] 함수의 Scope가 종료되는 시점에 해야할 일을 정하고 싶다면? defer 문!
호르댕댕댕 2022. 6. 2. 15:53defer... 지금까지 크게 사용할 일이 없어서, 찾아봐야지 하고 미루고 미루다 정리를 하게 됐다.
진짜 이름따라 블로그 정리도 늦춰진 것 같다.. ㅎㅎ...
그렇다면 defer는 뭘까?
일단 사전에 찾아보면 다음과 같이 나온다.
defer = 미루다, 연기하다
문자 그대로 함수의 scope가 종료할 때 실행될 행동을 defer문 안에 두고 이를 가장 마지막에 사용할 수 있다.
간단한 예시를 살펴보자
func deferStatement1() {
defer {
print("나중에 실행하기")
}
print("먼저 실행하기")
}
deferStatement1()
기존 함수를 실행할 때에는 함수가 정의되어 있는 순서대로 호출이 되지만 defer문 안에 있는 것은 함수의 scope가 종료되는 시점에 동작하도록 연기된다.
위의 경우에도 먼저 실행하기 -> 나중에 실행하기 순으로 실행되는 것이다.
defer에서 주의할 점
다만 defer문이 호출된 경우에만 defer문이 마지막에 실행될 수 있다.
defer문에 애초에 호출도 안되고 함수가 종료가 된 경우에는 defer문이 영원히 실행되지 않는다.
func deferStatement2() {
if true {
print("먼저 실행하기")
return // 애초에 defer문을 호출하지 않아 defer 문에 있던 것들은 실행이 되지 않는다
}
defer {
print("나중에 실행하기")
}
}
deferStatement2()
만약 defer가 여러 개 있다면 어떻게 실행이 될까?
가장 먼저 작성된 defer가 가장 마지막으로 미뤄지게 된다.
func deferStatement3() {
defer {
print(1)
}
defer {
print(2)
}
defer {
print(3)
}
}
deferStatement3()
만약 이렇게 출력을 하게 된다면 3 -> 2 -> 1 순으로 호출될 것이다.
하지만 defer문을 여러 개 사용할 경우 어떤 것이 먼저 호출될 것인지 혼란이 있을 수 있기 때문에 왠만하면 하나의 defer문만 사용하는 것이 좋다.
이는 for문 같은 반복문에서도 동일하게 사용이 가능하다.
for i in 1...3 {
defer { print ("Defer된 숫자?: \(i)") }
print ("for문의 숫자: \(i)")
}
/*
for문의 숫자: 1
Defer된 숫자?: 1
for문의 숫자: 2
Defer된 숫자?: 2
for문의 숫자: 3
Defer된 숫자?: 3
*/
일단 defer문을 호출하며 scope 종료 시 호출이 될 수 있도록 예약이 되며, 다음 줄의 print 문을 호출하게 된다.
이후 scope가 종료되면서 예약해놨던 defer문 내부의 print 문이 호출되고 다음 반복을 실행하게 된다.
'Software Engineering > Swift' 카테고리의 다른 글
[Library] SnapKit에 대해 알아보자 (remakeConstraints와 updateConstraints의 차이) (0) | 2022.08.29 |
---|---|
[Swift 기본 문법] Double에선 %(모듈로) 대신 .truncatingRemainder(dividingBy:)!! (0) | 2022.06.03 |
[Swift 기본문법] Swift 제어 전송문 총 정리 (break, fallthrough, continue, return, throw) (0) | 2022.05.17 |
[Swift 기본 문법] Collection(Array / Dictionary / Set / KeyValuePairs) (0) | 2022.04.27 |
[Swift 기본문법] Generic & Result 공식문서 보기 (0) | 2022.04.26 |