본문 바로가기

Swift(IOS)

[내용정리] Swift - closure(클로저)란? (2/2)

클로저를 공부하다보니 2편까지 오게되었는데.. 1편의 기초를 보지않았다면 1편을 먼저 보고오는것을 적극 추천합니다.

https://yoonds-develop.tistory.com/manage/newpost/22?type=post&returnURL=https%3A%2F%2Fyoonds-develop.tistory.com%2F22



1편의 마지막 코드를 살펴보면 호출과 동시에 클로저를 정의한부분이 있다.

바로 해당코드인데 마지막 method부분을 함수 바깥에서 표현이 가능하다.

동시에 매개변수명도 생략이 가능하다. 이를 후행클로저 라고한다.

 

후행클로저의 조건

  • 마지막 전달인자가 클로저여야함

func calculate(a: Int, b:Int, method: (Int, Int) -> Int) -> Int {
    
    return method(a,b)
}

// 후행클로저를 사용하지않음
var calculateResult = calculate(a: 20, b: 15, method: {(c: Int, d: Int) -> Int in
    
    return c + d //결과 : 35
})

//후행클로저를 사용함
var calculateResult = calculate(a: 20, b: 15) { (c: Int, d: Int) -> Int in
    
    return c + d //결과 : 35
}

 

 

클로저는 또 반환타입을 생략이 가능하다. (반환타입 '-> Int'가 생략 되었다.)

예를 들어 c와 b가 Int로 정의되어있는데 당연히 반환값도 Int지 하고 컴파일러가 인지하고있어서 생략이 가능하다.

이는 후행클로저를 사용하지 않아도 동일하게 생략이 가능하다.

//후행클로저를 사용함
var calculateResult = calculate(a: 20, b: 15) { (c: Int, d: Int) in
    
    return c + d
}

 

 

지금은 매개변수 명이  a, b등으로 짧아서 return 값에 a+b등으로 기재하는게 편하지만

나중에 파라미터명이 a가 아닌 yoondsNextNumber 등으로 길어진다하면

return yoondsNextNumber + b 로 나타내야할까? 가독성이 너무 떨어지는것같다.

 

 

그래서 단축인자이름을 지원한다. in이름을 생략하는 동시에 후행클로저를 함께 사용할수 있다.

매개변수 순서대로 $0, $1, $2..로 표시하면 된다.

var calculateResult = calculate(a: 20, b: 15, method: {
    
    return $0 + $1 
    // return a + b 와 동일
})

 

 

그리고 또한 클로저는 마지막 값(제일 마지막줄)을 반환해주는 관계로

당연히 마지막라인이 반환값이겠지하고  return도 생략이 가능하다.

var calculateResult = calculate(a: 20, b: 15, method: {
    
     $0 + $1 
})

 

 

클로저의 경량화에 대해서 알아봤는데 경량화가 되면 코드가 직관적이며 간결해지지만

코드를 공유하는 상황에서 이해하기 어렵고 오히려 가독성이 안좋아질수도 있어서 어느정도

경량화를 남발하면 안될것같다.