ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Apple Dev Reference - Swift] Trailing Closures 클로져를 파라미터로 간단히 사용하기
    앱등이에게 살충제를 뿌린다./Apple Dev Reference 2016. 4. 26. 23:39




    Trailing Closures

    함수의 파라미터로 클로져를 넣을 때가 있습니다. 그 중 함수의 파라미터 중 마지막 파라미터가 클로져일 경우에는 trailing closure로 코드를 적는 것이 더 편합니다. trailing closure란 클로져를 함수를 호출하는 부분의 바깥에 클로져를 적어주는 건데요, 아래 예를 보면 이해가 빠르실 듯 합니다.

    세 경우 모두 완전히 동일한 작동을 합니다.


    Swift에는 배열의 여러 element들을 정렬하기 위한 sort(_:)라는 메소드가 있습니다.(참고 : Closure Expression Syntax)

    이 함수는 하나의 클로져를 파라미터로 받는 함수인데요, 아래처럼 메소드의 호출 바깥 부분에 클로져를 적어주고 있습니다.


    만약 함수의 파라미터가 클로져 1개일 경우에는 ()를 적어줄 필요도 없습니다. 따라서 아래처럼 적어주셔도 결과는 동일합니다.


    trailing closure는 클로져의 내용이 길 때 진짜 힘을 발휘합니다. Swift의 Array에는 map(_:)이라는 메소드가 있습니다. 이 메소드는 클로져 1개를 파라미터로 받는 메소드입니다. 전달받은 클로져는 배열의 각 멤버들에 대해 호출되어 해당 멤버에 대해 mapping되는 값을 리턴(멤버와 다른 타입이어도 됨)하는 기능을 합니다. 어떤 값이 어떤 타입으로 리턴되는지는 완전히 클로져에서 결정되는 것이죠.


    각 element들에 대해 이 클로져를 적용하면 map(_:)메소드는 mapping된 값들로 이루어진 새로운 배열을 리턴합니다.


    아래 예제는 map(_:)메소드에 trailing closure를 이용하여 Int배열의 값을 mapping한 String배열을 리턴하는 과정입니다.

    [16, 58, 510]으로 ["OneSix", "FiveEight", "FiveOneZero"]을 만들겁니다.



    위 코드에서 한 자리의 숫자를 이 숫자의 영어 스펠링을 딕셔너리로 구성했습니다. 그리고 String배열로 변환시키기 위한 Int배열도 만들었습니다.

    이제 numbers라는 배열으로 strings라는 배열을 만들텐데요. map(_:)메소드에 클로져를 넘겨서 이 작업을 해보겠습니다.


    map(_:)메소드에 전달된 클로져가 배열의 모든 멤버에 대해 한번씩 실행됩니다. 위 클로저에서는 input파라미터로 number를 명시해주었지만, 굳이 안해주어도 타입 추론이 있기 때문에 문제되지 않습니다. 이 예제에의 number는 클로져의 파라미터인 number로 초기화되고 있기 때문에 클로져 내부에서는 이 값의 타입을 유추할 수 있게 되는 것입니다. (함수와 클로져의 파라미터는 항상 상수로 간주됩니다.) 클로져가 String을 리턴하고 있습니다. 따라서 map(_:)이 리턴하는 배열은 String으로 채워지게 되겠네요.

    클로져가 한번 호출될 때마다 하나의 output이라는 String을 만들고 있습니다. 나머지 계산법(number % 10))을 통해서 각 자리수의 숫자들을 digitNames딕셔너리를 참조하여 스펠링으로 변환하고 있습니다. 


    Note : digitNames를 subscript로 참조하면서 느낌표를 사용해주고 있는데요, 이는 딕셔너리의 subscript가 옵셔널 타입을 리턴하기 때문입니다. 옵셔널 타입을 리턴하는 이유는 잘못된 키 값을 받았을 때 nil을 리턴해야하기 때문이구요. 위의 예제에서는 항상 0~10사이의 값을 갖는 number % 10에 대해서 subscript를 호출하기 때문에 실패할 일이 절대 없습니다. 그래서 강제 해제를 해도 문제가 없습니다.


    위 함수의 작동에 대한 설명은 생략하도록 하겠습니다. 

    위의 예제는 함수의 호출부분 바깥에 클로져를 삽입하는 trailing closure구문 사용을 아주 깔끔하게 보여주고 있습니다.




    출처 : https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html

Designed by Tistory.