인프런 커뮤니티 질문&답변

khs50851님의 프로필 이미지
khs50851

작성한 질문수

앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지

네트워크 통신의 예시 (문법 - 172강)

네트워크 통신의 예시(문법 172강) 질문 있습니다.

작성

·

344

1

안녕하세요. 강의 항상 잘 보고 있습니다. 제목 관련 질문이 있는데

// 실제 다운로드 코드

movieManager.fetchMovie(date: "20210201") { (movies) in

    

    if let movies = movies {

        

        // 배열 받아서 빈배열에 넣기

        downloadedMovies = movies

        dump(downloadedMovies)

        

        print("전체 영화 갯수 확인: \(Movie.movieId)")

    } else {

        print("영화데이터가 없습니다. 또는 다운로드에 실패했습니다.")

    }

}

여기 클로저에서 movieManager.fetchMovie(date: "20210201") { (movies) in 이렇게 되어있는데 movies에 괄호를 빼고 그냥 movies라고 해도 상관 없는건가요?? 왜 이쪽에는 (movies) 이렇게 소괄호가 붙어있는건가요??

답변 부탁드리겠습니다. 감사합니다.

답변 2

1

khs50851님의 프로필 이미지
khs50851
질문자

이해 됐습니다! 감사합니다 ㅎㅎ

0

앨런(Allen)님의 프로필 이미지
앨런(Allen)
지식공유자

안녕하세요. khs50851 님.


해당 내용에 관련하여서는 클로저 사용 관련 문법을 좀 살펴보셔야 할 것 같습니다.
(앱 만들기 관련 내용이라기보다는 Swift문법 관련 내용입니다. 본 수업은 문법 수업이 아니므로, 최대한 간단하게 설명드릴께요. 추가적으로 클로저 사용 관련 문법을 찾아보시기 바랍니다.)

 

아래처럼 함수를 정의하고 인풋으로 함수를 사용할때
(인풋이 3개인 함수를 정의해보죠. 정수 2개, 함수 1개로 함수를 아래 처럼 정의 할수 있고)

// 함수정의
func addTwoNumberAndCall(a: Int, b: Int, completion: (Int) -> Void) {
    let c = a + b
    completion(c)
}

 

실제 위와 같이 정의한 함수를 호출해서 사용한다고 하면

// 함수실행
addTwoNumberAndCall(a: 3, b: 4, completion: (Int) -> Void)

마지막 함수형태(Int) -> Void 의 파라미터에 아규먼트를 전달할때 여러가지 형태로 전달이 가능합니다.

 

위의 함수 실행을.. 실제 아래의 모든 형태로 사용가능합니다.

// (1) 콜백함수를 클로저 형태로 전달 (생략 안하고 사용)
addTwoNumberAndCall(a: 3, b: 4) { (num: Int) -> Void in
    print(num)
}


// (2) 아웃풋 생략 가능
addTwoNumberAndCall(a: 3, b: 4) { (num: Int) in
    print(num)
}


// (3) 인풋 타입 생략 가능
addTwoNumberAndCall(a: 3, b: 4) { (num) in
    print(num)
}


// (4) 인풋 괄호 생략 가능
addTwoNumberAndCall(a: 3, b: 4) { num in
    print(num)
}

 

(Int) -> Void 의 형태 즉, 인풋이 정수이고, 아웃풋이 Void인 형태의 함수(콜백함수)를 전달하면 되는데, 이때 이미 타입이 정해져 있기 때문에... 인풋을 (1)처럼 전체 생략 안하고 사용도 가능하고, (2)처럼 아웃풋 생략도 가능합니다. 또, 어짜피 인풋이 Int로 정해져 있기 때문에 (3)처럼 타입을 생략하는 것도 가능하고 (괄호사용), (4)처럼.. 어짜피 파라미터(num)를 지칭하는 것이기 때문에 괄호를 생략하는 것도 가능합니다.

 

위처럼, (1), (2), (3), (4) 모든 형태로도 사용이 가능합니다. 어찌되었든, (1)의 형태가 아무것도 생략을 안한.. 원본 그대로 형태의 함수라고 보시면 됩니다. (클로저는 결국 함수죠?)

 

그래서 위처럼 여러가지 형태로 사용할 수 있는 것이 클로저 문법에서의 약속들입니다. 그러니까, 결론적으로 movies에서도 완전히 동일하게

(1) (movies: [Movie]) -> Void
(2) (movies: [Movie])
(3) (movies)
(4) movies

의 모든 형태가 가능한 것입니다.

 

감사합니다. :)

 

khs50851님의 프로필 이미지
khs50851

작성한 질문수

질문하기