다음과 같은 블럭함수를 사용할 경우에, 에러가 발생한다.
"Escaping closure captures non-escaping parameter 'completion'"
func testFunc(_ completion: (String?) -> Void ) {
DispatchQueue.global().async {
print("global something...")
DispatchQueue.main.async {
completion("End")
}
}
}
원인은 testFunc이 종료되고 나서 completion이 호출되는데, 호출이 불가하기 때문이다.
이러한 경우에 @escaping 을 선언해주면 정상 동작을 한다.
func testFunc(_ completion: @escaping (String?) -> Void ) {
DispatchQueue.global().async {
print("global something...")
DispatchQueue.main.async {
completion("End")
}
}
}
여기까지는 모두 알고 있는 항목이였을 것이다.
굳이 뭐 이런 글을이라며....
하지만, 오늘 배운게 하나 있는데, completion이 옵셔널로 선언된다면, default값으로 @escaping이 설정된다는 것이였다.
다음과 같이 코드 작성이 가능하다는 말이다.
func testFunc(_ completion: ((String?) -> Void)? ) {
DispatchQueue.global().async {
print("global something...")
DispatchQueue.main.async {
completion?("End")
}
}
}
난 분명 까먹을것이기 때문에, 기록을 남긴다.