1. @autoclosure

파라미터로 전달된 일반 구문 & 함수를 클로저로 래핑(Wrapping) 하는 것

func doSomething(closure: @autoclosure () -> ()) {
}

이렇게 했을 경우, 이제 closure란 파라미터는 실제 클로저를 전달받지 않지만, 클로저처럼 사용이 가능함!!

파라미터로 값을 넘기는 것 처럼 **()**를 통해 구문을 넘겨줄 수가 있음

2. @escaping

우리가 클로저를 사용하면서 습관적으로 많이 붙힌 해당 키워드는 언제 사용하는 것일까?

2-1. @escaping 키워드를 왜 사용할까?

자 우리는 아래와 같이 클로저와 실행문을 사용할 수 있습니다

func hidi(completion: () -> ()) {
		completion()
}

hidi {
		print("멋진 아요개발자가 될거에요!")
}

근데 만약에 매개변수로 받은 completion에 저장된 클로저를 3초 후에 실행시키고 싶다면 아래와 같이 코드를 짜겠죠?

func hidi(completion: () -> ()) {
		DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
				completion()
		}
}

하지만 이러면 아래와 같은 에러가 발생합니다! 왜 이런 문제가 발생할까?

Untitled

Non-escaping Closure

⇒ 일반적으로 아무런 키워드 없이 파라미터로 받는 클로저는 모두 non-escaping 클로져

즉. 탈출 불가능한 클로져 ⇒ 함수의 흐름을 탈출하지 않는 클로져