안녕하세요,
minuco입니다. :)
마지막입니다.
우리가 지금까지 공부했던 Closure는 Non_Escapin Closure입니다.
즉, 함수에서 파라미터로 전달될 때 일반적으로 함수가 반환되기 전에 실행되는 Closure입니다.
Non-Escaping Closure
일반적인 Closure
func showString(completion: () -> Void) {
completion() // 실행하고 종료
}
showString {
print("a")
}
// 일반적인 Closure는 호출은 Function 안에서 종료된다.
클로저가 실행되는 순서를 보면, closure가 showString() 함수의 completion 인자로 전달되고, 함수 내부에서 closure type completion이 실행된다. 그 후, showString() 함수가 반환되고 종료된다.
즉, 함수가 반환되기 전에 closure 실행이 종료된다는 것이다.
하지만, Closure를 만들어 놓고 나중에 쓰고 싶을 경우가 있을 것(Function실행이 끝나고 나서도)이다.
그때, @escaping 속성을 이용한다.
Escaping Closure - @escaping 사용
@escaping 속성을 사용하면 함수가 반환된 후에 Closure가 실행될 수 있음을 의미한다. 이는 Closure가 즉시 실행되지 않고 나중에 사용하기 위해 저장되기 때문에 우리가 원하는 기능을 사용할 수 있다. 하지만, @escaping 속성이 붙는다 해도 non-escaping Closure 인자로 넣을 수 있다.
func showString(completion: @escaping () -> Void) {
completion()
}
showString {
print("closure")
}
그럼 @escaping 속성을 사용한 예제를 살펴보자
우선, closure를 밖에서 실행할 array 변수를 생성하고 closure 안에서 append 해줄거다.
그런데!! @escaping 키워드를 안 적으면
Converting non-escaping parameter 'completion' to generic parameter 'Element' may allow it to escape 에러 남!!
그럼 당황하지말고 fix를 눌러주거나 위 코드처럼 @escaping 키워드를 적어주면 된다.
func showString(completion: () -> Void) { // Converting non-escaping parameter 'completion' to generic parameter 'Element' may allow it to escape
completion()
}
showString {
print("a")
}
에러의 해석은 "이스케이프 되지 않은 매개 변수 'completion'을 일반 매개 변수 'Element'로 변환하면 이스케이프 될 수 있습니다"이다. 즉 escaping 되지 않은 파라미터라 escaping 해주 말.
// array 선언
var myArrayList1 = [() -> Void]() // 그냥 선언
var myArrayList2: [() -> Void] = [] // 초기화해서 선언
func showString(completion: @escaping () -> Void){
myArrayList1.append(completion)
}
showString {
print("Closure")
}
// array 에 추가 [()->()]
showString {
print("Closure")
}
// 하나 더 추가 [() -> (), () -> ()]
// 출력
myArrayList1.forEach { completion in
completion()
}
/*실행 값
Closure
Closure
*/
긴 글 읽어주셔서 감사합니다.
@escaping를 알아보았는데요, 기존 closure에서 그냥 키워드만 추가되고,
이 키워드가 붙으면 함수가 반환된 후에 호출된다! 를 명심하면 될 거 같습니다.
요약하자면 escaping closure는 비동기 작업을 수행하거나,
나중에 사용하기 위해 closure를 저장할 때 사용 한다.
그럼 또 열심히 하러.. 🐜🐜 (뚠뚠)
'iOS > Swift' 카테고리의 다른 글
[Swift Network] URLSession (0) | 2023.04.12 |
---|---|
[Swift Network] URLSession - 사전지식 (0) | 2023.04.12 |
[Swift] Closure - 축약 (0) | 2023.03.23 |
[Swift] Closure - Capturing (0) | 2023.03.23 |
[Swift] Closure 기본 개념 (2) | 2023.03.20 |