티스토리 뷰
@escaping 키워드
- 클로저 앞에 작성하며, 매개변수에 사용된다.
- 필요한 이유?
- non-escaping의 경우, 함수가 종료되면, 파라미터로 쓰이는 클로저가 제거된다.
- escaping 키워드를 사용하면, stack frame에서 파라미터가 삭제 되지 않는다.
- 클로저가 함수의 실해 흐름을 벗어날 수 있도록 하는 것이다. 즉, 함수가 종료되어도 클로저가 존재할 수 있도록 한다.
- 언제 사용할까?
- 함수 내부에 존재하는 클로저(함수)를 외부 변수에 저장할 때
- GCD 비동기 코드
@escaping 키워드를 사용하는 경우
- 어떤 함수의 내부에 존재하는 클로저(함수)를 외부 변수에 저장할 때
- 기존 non-escaping이라면, 단순 실행 후 종료한다면, Heap에 저장할 필요가 없다.
- escapin의 경우, 함수의 실행이 끝나도, 해당 함수를 사용해야한다. (메모리 관리가 필요해짐)
- closure가 Heap에 저장되어야 한다. (캡처와 비슷)
- 함수 외부에서 해당 값을 사용하기 때문에, Heap에서의 관리가 필요하다.
- Heap에 저장되어, 더 오랜 시간 메모리에서의 관리가 필요할 때 사용한다.
- var saveFunction: () -> () = { print("출력") } func performEscaping(closure: @escaping () -> ()) { saveFunction = closure // 클로저를 실행하는 것이 아니라, saveFunction에 저장한다. } saveFunction() performEscaping(closure: { print("다르게 출력") }) // saveFunction에 할당 saveFunction() // "다르게 출력"가 출력됨
- GCD (비동기 코드의 사용)
// GCD 비동기 코드
func performEscaping(closure: @escaping (String) -> ()) {
var name = "홍길동"
DispatchQueue.main.asyncAfter(deadline: .now() + 1) { // 1초 후 실행
closure(name)
}
}
performEscaping { str in
print("이름: \\(str)")
}
@autoclosure
- 자동으로 클로저를 만들어주는 키워드이다.
- 클로저 형태로 전달하지 않아도, 자동으로 클로저 형태로 변환하여 전달해준다.
- 파라미터가 없는 클로저만 사용할 수 있다. (input이 없는 경우)
- 클로저 형태로 써도 되지만, 번거로운 경우에만 사용한다.
- 번거로움은 해결해주지만, 코드의 명확성을 떨어뜨리므로 사용을 지양하자.
- non-escaping 특성을 가지고 있다.
func someFunction(closure: @autoclosure () -> Bool) {
if closure() {
print("참")
} else {
print("거짓")
}
}
var num = 1
someFunction(closure: num == 1)
// escaping과의 결합
func someAutoClosure(closure: @autoclosure @escaping () -> String) {
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
print("소개합니다: \\(closure()")
}
}
someAutoClosure(closure: "제니") // 중괄호가 필요 없어짐
앨런님의 강의를 듣고 작성한 글입니다.
'Swift > Swift 문법' 카테고리의 다른 글
[고차함수 2] Map (0) | 2022.12.29 |
---|---|
[고차함수 1] 고차함수는 무엇인가? (0) | 2022.12.29 |
[클로저 - 4] 클로저의 캡처 (0) | 2022.12.29 |
[클로저 - 3] 클로저 문법 최적화 (0) | 2022.12.28 |
[클로저 - 2] 클로저를 사용하는 이유 (0) | 2022.12.28 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 이것이 코딩테스트다
- python
- level1
- 시간초과
- 코드 업
- 반복문
- 정답
- 16진수 입력
- 레플릿
- 설명
- 깃허브
- SwiftUI
- do while
- CHR
- 파이썬
- ord
- baekjoon
- COMMIT
- Swift
- 프로그래머스
- 기초 100제
- 코드업
- 깃
- 백준
- CodeUp
- replit
- for문
- 리플릿
- 부르트포스
- Code up
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 |
30 | 31 |
글 보관함