minuco
article thumbnail
Published 2023. 3. 23. 15:45
[Swift] Closure - escaping iOS/Swift

안녕하세요,

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
profile

minuco

@minuco

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!