@escaping

다음과 같은 블럭함수를 사용할 경우에, 에러가 발생한다.
“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")
            }
        }
    }

난 분명 까먹을것이기 때문에, 기록을 남긴다.

답글 남기기