이스케이핑 클로저
함수보다 오래 유지되는 클로저를 저장합니다.
이스케이핑 클로저은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
탈출 클로저와 비탈출 클로저 비교
기본적으로 클로저 매개변수는 비탈출입니다. 함수가 반환되기 전에 호출되어야 합니다. 나중에 저장하고 호출할 수 있다면 @escaping으로 표시하세요.
비탈출 클로저
이 클로저는 동기적으로 실행되고 함수가 반환되면 사라집니다:
func run(_ work: () -> Void) {
work()
}
run { print("done now") } // "done now"@escaping이 필요한 이유
나중에 사용하기 위해 클로저를 저장하려면 @escaping이 필요합니다:
var handlers: [() -> Void] = []
func register(_ handler: @escaping () -> Void) {
handlers.append(handler) // escapes the function
}
register { print("later") }
handlers[0]() // "later"비동기 작업과 함께 탈출하기
완료 핸들러는 함수가 반환된 후에 실행되므로 탈출합니다:
func load(then completion: @escaping (String) -> Void) {
// imagine async work
completion("data")
}
load { result in print(result) } // "data"self는 명시적으로 작성해야 합니다
탈출 클로저 안에서 인스턴스 멤버에 접근할 때는 self.를 명시적으로 작성해야 합니다 — 클로저가 self를 유지할 수 있음을 알려 주는 표시입니다.
탈출 클로저에서 self를 명시하기
컴파일러는 명시적인 참조를 요구합니다:
class Loader {
var name = "L"
func start(_ done: @escaping () -> Void) {
let cb = { print(self.name); done() }
cb()
}
}
Loader().start { print("finished") } // "L" then "finished"여러 콜백 저장하기
탈출 클로저를 사용하면 관찰자 목록을 만들 수 있습니다:
class Emitter {
private var listeners: [(Int) -> Void] = []
func on(_ l: @escaping (Int) -> Void) { listeners.append(l) }
func fire(_ v: Int) { listeners.forEach { $0(v) } }
}
let e = Emitter()
e.on { print("got \($0)") }
e.fire(7) // "got 7"저장된 클로저 반환하기
속성에 보관된 클로저는 탈출 클로저입니다:
class Button {
var action: (() -> Void)?
func setAction(_ a: @escaping () -> Void) { action = a }
}
let b = Button()
b.setAction { print("tapped") }
b.action?() // "tapped"선택적 클로저는 탈출합니다
선택적 클로저 매개변수는 암시적으로 탈출합니다(Optional로 감싸지기 때문입니다). 따라서 저장할 수 있습니다:
func maybe(_ f: (() -> Void)?) {
f?()
}
maybe { print("ran") } // "ran"작업 배열로 탈출하기
나중에 실행할 작업을 저장하는 큐는 전형적인 탈출 사용 사례입니다 — 각 클로저를 저장한 다음 나중에 실행합니다:
var tasks: [() -> Int] = []
func schedule(_ task: @escaping () -> Int) {
tasks.append(task)
}
schedule { 1 + 1 }
schedule { 10 * 2 }
print(tasks.map { $0() }) // [2, 20]성능 참고
비탈출 클로저는 더 적극적으로 최적화할 수 있습니다(힙 할당이 필요하지 않음). 가능하면 클로저를 비탈출로 유지하고, 실제로 저장하거나 실행을 미뤄야 할 때만 탈출시키세요.
func sum(_ xs: [Int], _ f: (Int) -> Int) -> Int {
xs.reduce(0) { $0 + f($1) } // non-escaping, fast
}
print(sum([1, 2, 3]) { $0 * $0 }) // 14빠른 확인
클로저 매개변수에 @escaping을 표시해야 하는 경우는 언제인가요?
복습
탈출 클로저에 대해 배웠습니다:
- 비탈출이 기본값이며, 클로저는 함수가 반환되기 전에 실행됩니다
- 클로저를 저장하거나 실행을 미루려면
@escaping이 필요합니다 - 탈출 클로저에서는
self.에 명시적으로 접근해야 합니다 - 선택적 클로저 매개변수는 암시적으로 탈출하므로, 속도를 위해 비탈출 방식을 우선하세요
다음: 캡처 목록과 weak self
자주 묻는 질문
“이스케이핑 클로저” 강의는 무료인가요?
네 — “이스케이핑 클로저” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“이스케이핑 클로저”에서 뭘 배우나요?
함수보다 오래 유지되는 클로저를 저장합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Swift Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“이스케이핑 클로저” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 참조로 값 캡처하기
- 이스케이핑 클로저
- 캡처 목록과 약한 self
- 자동 클로저