Closures #2
Context로부터 Type 추론
- sorting closure가 함수의 인자로 전달되었기 때문에 Swift는 closure의 파라미터 type과 반환 type을 추론할 수 있다.
sorted(by:)
함수가 String 배열로부터 호출되었기 때문에 파라미터로 받는 함수 Type은(String, String) -> Bool
이어야 한다.- 이렇게 추론이 가능하기 때문에 String, String, Bool은 closure 표현식을 정의하는데 쓸 필요가 없다.
- 또한 반환을 의미하는 화살표(
->
)와 파라미터를 둘러싼 괄호 역시 생략 가능하다.
reverseNames = names.sorted(by: { s1, s2 in return s1 > s2} )
- 함수나 메서드의 인자로 inline closure 표현식을 전달할 때는 항상 파라미터와 반환 Type을 추론할 수 있다.
- 결과적으로 함수나 메서드로 전달되는 inline closure 표현식은 완전한 형식으로 사용할 필요가 없다.
- 하지만 코드를 읽는 사람이 모호하게 해석하지 않도록 하기 위해서는 type을 명시해주는 것이 좋다.
Single-Expression Closures에서의 암묵적인 반환
- 단일 표현의 closures는 자신의 단일 표현식에 대한 결과를 return 키워드를 생략한채 반환할 수 있다.
reverseNames = names.sorted(by: { s1, s2 in s1 > s2} )
- closuer의 내용에 있는 단일 표현식 (s1 > s2)가 분명하게게Bool 값을 반환한다는 것을 알기 때문에
sorted(by:)
함수의 인자는 명백하게 closure로부터 Bool 값을 반환받는 다는 것을 알 수 있다.
Shorthand Argument Names
- Swift는 inline closures에서 $0, $1, $2 등과 같이 closure의 인자 값을 참조할 수 있는 Shorthand Argument Names을 제공한다.
- closure 표현식 내에서 Shorthand Argument Names을 사용한다면 closure 정의 시 인자 목록을 생략할 수 있다.
- Shorthand Argument Names의 type은 예상되는 함수의 타입이으로부터 추론되고 인자의 수는 Shorthand Argument Names의 번호 중 가장 높은 번호로부터 추론된다.
- closure 표현식이 body 전체로 만들어지기 때문에 in 키워드 역시 생략 가능하다.
// $0, $1 두 개의 Shorthand Argument Names가 있기 때문에 인자는 2개로 추론되고
// sorted 함수가 두 개의 String type 인자를 가진 closure를 받기 때문에 인자 type은
// String으로 추론된다.
reverseNames = names.sorted(by: { $0 > $1} )
Operator Methods
- 더 짧은 closure 표현식도 사용할 수 있다.
- Swift의 String type은 greater-than(>) 연산자를 두 개의 String 파라미터를 받아 Bool type을 반환하는 메서드처럼 사용할 수 있도록 문자열에 특성에 맞도록 정의하였다.
- 이 것은
sorted(by:)
메서드가 요구하는 조건과 정확히 일치한다. 따라서 다음과 같이 표현 가능하다.
reverseNames = names.sorted(by: > )