defer ๊ตฌ๋ฌธ์, defer ๊ตฌ๋ฌธ์ด ์๋ ๊ณณ์์, ํ๋ก๊ทธ๋จ ์ปจํธ๋กค์ ์ค์ฝํ ๋ฐ๊นฅ์ผ๋ก ์ฎ๊ธฐ๊ธฐ ๋ฐ๋ก ์ง์ ์ ์คํํ๋ ค๋ ์ฝ๋์ ์ฌ์ฉํ๋ค.
defer {
// statements
}
defer ๋ฌธ ์์ ์๋ ๋ด์ฉ์ ํ๋ก๊ทธ๋จ ์ ์ด๊ฐ ์ด๋ป๊ฒ ์ด๋๋๋์ง์๋ ๊ด๊ณ ์์ด ์คํ๋๋ค. ์๋ฅผ ๋ค์ด ์๋์ ์ผ๋ก ์์๊ด๋ฆฌ๊ฐ ๋ค์ด๊ฐ ๋, ์๋ฌ๊ฐ ๋ฐ์๋๋๋ผ๋ ์ก์ ์ ์ํํด์ผ ํ ๋ ์ฌ์ฉํ๋ค.
Defer๊ฐ ์คํ๋๋ ์์
์ฌ๋ฌ๊ฐ์ defer๋ฌธ์ด ์์ ๋
๊ฐ์ ์ค์ฝํ ๋ด์ ์ฌ๋ฌ๊ฐ์ defer ๋ฌธ์ด ์์ผ๋ฉด, ์คํ๋๋ ์์๋ ๋ณด์ด๋ ์์์ ์ญ์. ๋ง์ง๋ง defer ๋ฌธ์ ์ฒซ๋ฒ์งธ๋ก ์คํํ๋ค๋ ์๋ฏธ๋, ๋ง์ง๋ง defer ๋ฌธ ์์ ๋ด์ฉ์ ๋ค๋ฅธ defer ๋ฌธ์ ์ํด์ ์ ๋ฆฌ๋๋ ๋ฆฌ์์ค๋ฅผ ์ฐธ์กฐํ ์ ์๋ค๋ ๋ป.
func ๋ํผํจ์() {
defer { print("์ฒซ๋ฒ์งธ") }
defer { print("๋๋ฒ์งธ") }
print("๋ง์ง๋ง")
}
๋ํผํจ์()
// ๋ง์ง๋ง
// ๋๋ฒ์งธ
// ์ฒซ๋ฒ์งธ
defer๋ฌธ์ด ์ค์ฒฉ๋์ด ์์ ๋
์ค์ฒฉ๋์ด ์์ ๊ฒฝ์ฐ๋ ๊ฐ์ฅ ๋ฐ๊นฅ์ชฝ์ ์๋ defer๋ถํฐ ์คํ๋๋ค.
func ์ค์ฒฉ๋ํผํจ์() {
defer {
defer {
defer {
print("์ค์ฒฉ ์ฒซ๋ฒ์งธ")
}
print("์ค์ฒฉ ๋๋ฒ์งธ")
}
print("์ค์ฒฉ ๋ง์ง๋ง")
}
}
์ค์ฒฉ๋ํผํจ์()
// ์ค์ฒฉ ๋ง์ง๋ง
// ์ค์ฒฉ ๋๋ฒ์งธ
// ์ค์ฒฉ ์ฒซ๋ฒ์งธ
์ผ๋ฐ์ ์ธ ์ฉ๋ก
์ปจํ ์คํธ๋ฅผ ์ด๊ฑฐ๋ ๋ซ์ ๋
๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ ์ผ์ด์ค๋ ์ค์ฝํ ์์์ ์ปจํ ์คํธ๋ฅผ ์ด๊ฑฐ๋ ๋ซ์ ๋. ์๋ฅผ ๋ค์ด์ ํ์ผ ์ ๊ทผ์ ๋ํด ๋ค๋ฃฐ ๊ฒฝ์ฐ. FileHandle ์ ํ ๋ฒ ์ ๊ทผ์ด ๋๋๋ฉด ๋ฐ๋์ ๋ซ์์ค์ผํ๋๋ฐ ์ด๋ defer ๊ตฌ๋ฌธ์ ์ด์ฉํด ์์ง ์๊ณ ๋ซ์์ค ์ ์๋ค.
func writeFile() {
let file: FileHandle? = FileHandle(forReadingAtPath: filepath)
defer { file?.closeFile() }
// ํ์ผ๊ด๋ จ๋ ์ฝ๋๋ค ๋ฑ๋ฑ
}
๊ฒฐ๊ณผ๊ฐ
์ปดํ๋ฆฌ์ ์ฝ๋ฐฑ์์ ๋ฐํ๋๋ ๊ฒฐ๊ณผ๊ฐ ๊ด๋ จํ์ฌ ์ฌ์ฉ.
func getData(completion: (_ result: Result<String>) -> Void) {
var result: Result<String>?
defer {
guard let result = result else {
fatalError("We should always end with a result")
}
completion(result)
}
// ๊ฒฐ๊ณผ๊ฐ ์์ฑํ๊ธฐ
}
์ด๋ ๊ฒ ํด์ ๊ฒฐ๊ณผ๊ฐ์ ํญ์ ๊ฒ์ฆํ๊ณ ์ปดํ๋ฆฌ์ ํธ๋ค๋ฌ๋ฅผ ์คํํ๊ฒ ํจ. ๊ฒฐ๊ณผ๊ฐ์ด nil ์ผ ๊ฒฝ์ฐ, fatalError ๊ฐ ๋์ ธ์ง๊ณ ์ฑ์ด fail๋จ
๋ก๋ฉ ์ธ๋์ผ์ดํฐ
func performLogin() {
shouldShowProgressView = true
defer {
shouldShowProgressView = false
}
do {
let _ = try await LoginManager.performLogin()
DispatchQueue.main.async {
self.coordinator?.successfulLogin()
}
} catch {
let error = error
showErrorMessage = true
defer๊ฐ ์คํ๋์ง ์๋ ์ํฉ
defer๋ฌธ์ด ์ฝํ๊ธฐ ์ ์ ์ข ๋ฃ๊ฐ ๋๋ ์ํฉ์ผ ๋
import UIKit
var greeting = "Hello, playground"
func deferSometimeRun(value: Int?) {
guard let value = value else {
print("nil์ด๋ผ์ ์ข
๋ฃ")
return
}
defer {
print("#DEFER: ๊ฐ์ด \\(value) ์ผ ๋ ์คํ๋์ด์.")
}
print("๊ฐ : \\(value)")
}
deferSometimeRun(value: nil)
deferSometimeRun(value: 6)
// nil์ด๋ผ์ ์ข
๋ฃ
// ๊ฐ : 6
// #DEFER: ๊ฐ์ด 6 ์ผ ๋ ์คํ๋์ด์.
func deferAlwaysRun(value: Int?) {
defer {
print("#DEFER: ๊ฐ์ด \\(value) ์ผ ๋ ์คํ๋์ด์.")
}
guard let value = value else {
print("nil์ด๋ผ์ ์ข
๋ฃ")
return
}
print("๊ฐ : \\(value)")
}
deferAlwaysRun(value: nil)
deferAlwaysRun(value: 7)
// nil์ด๋ผ์ ์ข
๋ฃ
// #DEFER: ๊ฐ์ด nil ์ผ ๋ ์คํ๋์ด์.
// ๊ฐ : 7
// #DEFER: ๊ฐ์ด Optional(7) ์ผ ๋ ์คํ๋์ด์.
๋๋ฌธ์ defer ๊ตฌ๋ฌธ์ ํญ์ ํด๋น ์ค์ฝํ ๊ฐ์ฅ ์์ชฝ์ ํด๋๋ ๊ฒ์ ๊ถ์ฅ. (์๋๋ฉด defer๋ฌธ ์ฐ๋ ๊ฒ ์์ฒด๊ฐ ์ข ๋ฃ๋ฅผ ์ง์ฐํ๊ณ ๋ง์ง๋ง์ผ๋ก ์คํํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ )
์ฐธ๊ณ ๋งํฌ
Statements - The Swift Programming Language (Swift 5.7)
A complete guide to the Swift defer statement - LogRocket Blog
์ค๋๋ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๊ถ๊ธํ๊ฑฐ๋ ๋๋๊ณ ์ถ์ ์๊ธฐ๊ฐ ์์ผ์๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!
์ฌ๋ฐ๊ฒ ์ฝ์ผ์ จ๋ค๋ฉด ๊ณต๊ฐ๊ณผ ๊ตฌ๋ ์ ํฐ ํ์ด ๋ฉ๋๋ค.
ํญ์ ๊ฐ์ฌํฉ๋๋ค.
์ด ๊ธ์ doy.oopy.io ์๋ ๋ฐํ๋์ด ์์ต๋๋ค.
๋๊ธ