23-05-17
파이썬의 람다(lambda) 같은 놈이라고 함.
sorted by(:) 메소드와 클로저를 이용해 배열을 정렬
(String, String) -> Bool 타입의 클로저를 사용
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
func backward(_ s1: String, _ s2: String) -> Bool{
return s1>s2
}
var reversedNames = names.sorted(by: backward)
일반적으로 다음과 같이 사용한다.
{ (parameters) -> return type in
statements
}
위의 코드에서 in 앞을 클로저 헤드, 뒤를 클로저 바디라고 함.
위 정렬 메소드를 다음과 같이 짧게 표현할 수 있음.
reversedNames = names.sorted(by: {(s1: String, s2: String) -> Bool in
return s1>s2
})
sorted (by:)의 메소드에서 이미 (String, String)->Bool 이 들어와야 되는 것을 알기 때문에 이를 생략하여 더 짧게 표현할 수도 있음.
reversedNames = names.sorted(by: {s1, s2 in return s1>s2})
단일 표현 클로저에서는 반환 키워드 (return)도 생략 가능.
클로저 내부에 return 구문이 하나만 있을 경우를 말한다.
reversedNames = names.sorted(by: s1, s2 in s1 > s2)
인자 값을 순서대로 $0, $1, $2 등으로 사용 가능. 다음과 같이 표현한다.
reversedNames = names.sorted(by: {$0 > $1})
이와 같이 $와 인덱스를 이용헤 Parameter에 순서대로 접근하는 것을 Shorthand Argument Names라고 함.
가장 짧게 줄이려면 String 끼리 비교할 수 있는 비교연산자 (>) 을 사용해 다음과 같이 짧게 표현 가능.
reversedNames = names.sorted(by: >)
위와 같이 클로저를 활용해 코드의 길이를 극단적으로 줄일 수 있다.
그러나 코드를 이해하기 어려워진다는 단점이 있음.
📚 참고도서
[SwiftUI 기반의 iOS 프로그래밍]