서버 통신을 하는 중.. 이 과정을 비동기로 처리하며 받아오는 데이터를 append 하기 위해 forEach문을 사용하려고 했다.
그랬더니 아래와 같은 에러가 발생한다
Cannot pass function of type '(String) async throws -> Void' to parameter expecting synchronous function type
챗GPT에게 물어보니 이 에러는 비동기 함수를 동기 함수처럼 사용할 때 발생하는 에러라고 한다. 형식이 (String) async throws -> Void인 함수를 동기 함수 형식을 기대하는 매개변수에 전달할 수 었다 라는 뜻으로, 해당 함수를 동기적으로 처리하려고 했지만 매개변수가 비동기 함수를 필요로 하고 있기 때문에 발생한다는 의미이다.
스택오버플로우에도 같은 고민을 겪은 글이 있었다.
forEach는 특정한 인자를 받는 메서드로,
func forEach(_ body: (Self.Element) throws -> Void) rethrows
async 키워드가 없는 것을 알 수 있다. 때문에 비동기 환경에서 실행되지 않을 수 있다고 한다. 그렇기 때문에 forEach는 비동기 작업에서 사용할 수 없다고 한다.
설명을 덧붙이자면 forEach는 클로저 내에서 작업을 순차적으로 처리하지만, 클로저 내에서 다른 스레드나 비동기 작업이 실행될 때 루프가 끝나길 기다리지 않는다고 한다.
그러나 for-in문은 현재 스코프 안에서 실행되기 때문에 루프를 사용하면 루프가 완료될 때까지 루프 이후의 코드가 실행되지 않아 비동기 작업 처리가 가능하다.
그래서 이런식으로 for-in문을 사용해서 해결해줄 수 있다!