Swift/문법

클로저 고급

khon98 2021. 1. 28. 21:51

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

return method(a, b)

}

 

var result: Int

 

후행 클로저

- 클로저가 함수의 마지막 전달 인자라면 마지막 매개 변수 이름을 생략한 후 함수 소괄호 외부에 클로저를 구현할 수 있음

 

result = calculate(a: 10, b: 10) { (left: Int, right: Int) -> Int in

return left + right

}

 

print(result) // 20

 

 

반환 타입 생략

- calculate 함수의 method 매개 변수는 Int 타입을 반환할 것이라는 사실을 컴파일러도 알기 때문에 굳이 클로저에서 반환 타입( -> Int)을 명시해 주지 않아도 됨

 

result = calculate(a: 10, b: 10, method: { (left: Int, right: Int) in

return left + right

})

 

* 후행 클로저와 함께 사용 가능

result = calculate(a: 10, b: 10): { (left: Int, right: Int) in

return left + right

}

 

 

단축 인자 이름

- 클로저의 매개 변수 이름이 굳이 불필요하다면 단축 인자 이름을 활용할 수 있음

- 단축 인자 이름은 클로저의 매개 변수의 순서대로 $0, $1... 처럼 표현함

 

result = calculate(a: 10, b: 10, method: {

return $0 + $1

})

 

print(result) // 20

 

* 후행 클로저와 함께 사용 가능

result = calculate(a: 10, b: 10) {

return $0 + $1

}

 

print(result) // 20

 

 

암시적 반환 표현

- 클로저가 반환하는 값이 있다면 클로저의 마지막 줄의 결과 값은 암시적으로 반환 값으로 취급함

 

result = calculate(a: 10, b: 10) {

$0 + $1

}

 

print(result) // 20

 

* 간결하게 한 줄로 표현해 줄 수도 있음

result = calculate(a: 10, b: 10) { $0 + $1 }

 

print(result) // 20

 

* 축약하지 않은 클로저 문법과 축약 후의 문법 비교

// 축약 전

result = calculate(a: 10, b: 10, method: { (left: int, right: Int) -> Int in

return left + right

})

 

// 축약 후

result = calculate(a: 10, b: 10) { $0 + $1 }

 

print(result) // 20