컴파일? print("Hello World!")를 하게 되면 swift 컴파일러(swift 명령)는 사용자가 실행할 수 있는 바이너리 실행파일로 swift 소스파일을 컴파일 할 수 있게 된다.(사람이 있는 코드를 기계코드로 번역한다.)
인터페이스 빌더? 코딩과 상반된 개념인 그래픽 사용자 인터페이스를 말한다.
이해된 내용 - 처음 사용자가 interface builder에서 정보를 구성했을 때, .xib파일로 저장되며, 컴파일 과정을 통해 컴퓨터가 이해할 수 있는 바이너리 형태인 .nib파일로 전환된다.
어떤 기능을 하는 코드를 하나의 블럭으로 모아놓은 것을 말한다.
{(매개변수) -> 반환타입 in
코드블럭
}
클로저를 매개변수 중 하나로 사용하는 함수를 선언할 때, 매개변수 유형 앞에 @escaping을 작성하여 클로저가 탈출하도록 나타낼 수 있다. 어떻게? 클로저를 변수에 저장한다. 언제 사용할까? 비동기 작업을 시작하는 많은 함수는 클로저 인수를 completion handler로 사용한다. 함수는 작업을 시작하고 나서 return하지만, 클로저는 작업이 완료되기전까지 불리지 않는다. 클로저는 탈출해야 하고 나중에 호출된다.
클로저가 함수로부터 escape한다는 것은 해당 함수의 인자로 클로저가 전달되지만, 함수가 반환된 다음에 실행되는 것을 의미한다. (q. 반환된 다음에 실행되는 것은 어떤 차이가 있길래 그렇게 사용하는 것일까?) 함수의 인자가 함수의 영역을 탈출하여 함수 밖에서 사용할 수 있는 개념은 기존에 우리가 알 고 있던 변수의 scope 개념을 무시한다. (a. 아, 우리는 어떤 함수나 값을 쓰려면 해당 scope안에서만 출력이 되는 한계가 있었다. 코딩하다 몇번 불편했던 기억이 있는데,,,세부 예시는 생각이 안나네. 그러면 안에서 함수를 호출하면, 그 호출된 함수로 넘어가서 거기서 코드 진행이 된다. 유용하게 쓸 수 있을 것 같은데?) 특히나 클로저의. excaping은 a함수가 무조건 마무리 되어야 하기 때문에 함수 진행의 순서를 할 수 있게 된다.
엥? 함수 진행의 순서를 제공하는 건 또 무슨 이득이 있지? 이 순서를 보장하면 네트워크에서 데이터를 받아오고 표시할 때 굉장히 유용하다. 우리가 서버 api를 활용해 데이터를 받아오는데, 받아올 때마다 어땠어? 순서가 뒤죽박죽이잖아. 그런데 그것에 대한 순서를 정할 수 있지 않을까? 맞네. 그렇네. 네트워크에서 서버에서 request하여 데이터를 받아올 때, 주로 Alamofire를 쓴다. Alamofire로 request하면 get 방식으로 Json형식의 데이터를 받아온다. 그 결과는 response 객체로 받아오는데, request결과를 기다리고 있다. 엥?? 어떻게 ???? 바로 탈출 클로저이기 때문이다. 끝나야 실행이 된다. 알겠지? 끝나야 실행되는 이점이 아주 특징적이다. 또 responseJSON(queue: options: completionHandler: )에서 queue, options은 기본값이 지정되어 값을 주지 않아도 작동하지만, CompletionHandler는 다르다. 이 친구의 형태는 @escaping() -> (void) 탈출 클로저를 사용하고 있다. 그래서 responseJSON의 함수가 반환되고 그 이후에 CompletionHandler가 동작한다.