Swift3(스위프트3)

swift3 스위프트3 클로저 closure

알통몬_ 2017. 7. 5. 16:55
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 


이번 포스팅에서는 swift 3 Closure 클로저에 대해 공부합니다.


클로저는 코드의 블록으로 일급시민입니다.


우리가 앞서 배웠던 함수도 클로저의 일종입니다.

이름이 있는 클로저를 함수라고 지칭합니다.


 

선언 예

  { (매개변수 목록) -> 반환타입 in

      // TODO

  }

   반환타입의 생략은 불가능합니다.

   반환 값이 없을 경우 Void 를 선언합니다.


   예제)

     // 함수

      func sumFunc(a:Int, b:Int) -> Int {

         return a+b

      }


      var sumVar : Int = sumFunc(a:100, b:200)

      print(sumVar) // 300


     // 클로저

      var sumClosure : (Int, Int) -> Int = { (x:Int, y:Int) -> Int in

         return x + y

      } 

    // (Int, Int) -> Int

       클로저 표현입니다.


   sumVar = sumClosure(100,200)

   print(sumVar) // 300


   처음에 언급한 것처럼 함수는 클로저의 일종이기 때문에

   sumClosure 변수에 함수를 할당할 수도 있습니다.

   sumClosure = sumFunc(a:b:)



   

   함수의 전달인자로서의 클로저

   ex) 사칙연산

      let add : (Int, Int) -> Int
      add = { (a:Int, b:Int) -> Int in
         return a+b
      }
      let subtract : (Int, Int) -> Int
      subtract = { (a:Int, b:Int) -> Int in
         return a-b
      }
      let divide : (Int, Int) -> Int
      divide = { (a:Int, b:Int) -> Int in
         return a/b
      }
      
      func cals( a:Int, b:Int, functions : (Int, Int) -> Int {
         retrurn functions(a,b)
      })


      var cal : Int
      cal = cals(a:200, b:100, method : add)
      print(cal) // 300

      cal = cals(a:200, b:100, method : subtract)
      print(cal) // 100

      cal = cals(a:200, b:100, method : divide)
      print(cal) // 2

      // multiply
      자바의 익명 구현 객체처럼 따로 만든 클로저를 값으로 주는 게 아니라
      호출 시점에 코드 블록을 넣어줘도 됩니다.
      cal = cals(a:200, b:100, method :  (x:Int, y:Int) -> Int in {
            return x * y
       }




 

   클로저 단순화

   - 후행 클로저

   - 반환 타입 생략

   - 단축 인자 이름

   - 암시적 반환 표현


      func cals( a:Int, b:Int, functions : (Int, Int) -> Int {

         retrurn functions(a,b)
      })

      var example : Int
      //기본 사용
      example = cals(a:100, b:200, functions : (x:Int, y:Int) -> Int in {
          return x+y
     })

      // 후행 클로저
      - 클로저가 함수의 마지막 전달 인자일 경우 마지막 매개 변수의 이름일 생략하고
        함수의 소괄호 외부에 클로저를 구현할 수 있습니다.

      example = cals(a:100, b:200) { (x:Int, y:Int) -> Int in

         return x+y

      }


     // 반환 타입 생략

     - cals 함수의 functions 매개 변수는 Int 타입을 반환한다는 것을 컴파일러도 알고 있습니다.

       때문에 클로저에서 반환 타입을 명시해주지 않더라도 상관 없습니다.

       * in 키워드는 생략할 수 없습니다.

       example = cals(a:100, b:200, method(x:Int, y:Int) in {

          return x + y

       }

     

      // 후행 클로저와 반환 타입 생략을 동시에 사용할 수 있습니다.

      example = cals(a:100, b:200) { (x:Int, y:Int) in

        return x + y

      }


     // 단축 인자 이름

     - 클로저의 매개 변수이름이 굳이 필요하지 않다면 단축 인자 이름을 사용할 수 있습니다.

       단축 인자 이름은 매개 변수의 순서에 따라 $0, $1, $2 ... $n 으로 표현합니다.

      example = cals(a:100, b:200, method : {

          return $0 + $1

      }


     // 단축 인자 이름도 후행 클로저와 같이 사용할 수 있습니다.

     example = cals(a:100, b:200) { 

       return $0 + $1

     }


     // 암시적 반환 표현

     - 클로저가 반환하는 값이 있을 경우 클로저의 마지막 줄의 값을 암시적으로 

       반환 값으로 취급합니다.

      example = cals(a:100, b:200) {

        $0 + $1

     }



클로저의 단순화까지 공부해봤는데요.

클로저의 단순화의 경우 너무 축약할 경우 다른 사람이 알아보기 힘들어 질 수 있으므로

적당히 하는 것을 추천드립니다 ㅎㅎ


이상입니다.


다음 포스팅에서는 프로퍼티에 대해 공부합니다~

반응형