Swift 언어의 특징 중 하나는 "함수형 프로그래밍"이라는 점입니다.
이 함수형 프로그래밍을 이해하기 위해서 필요한 개념이 "클로저"입니다,
기존에 있던 객체지향 프로그래밍이나 C언어에서는 어떤 값이나 상태 변화를 중요하게 여기지만,
함수형 프로그래밍에서는 어떤 함수 자체를 활용해서 변하는 결과를 중요시 하는 것이 가장 큰 차이입니다.
예를 들면,
어떤 인자를 주고 받는 과정에서 여러 처리가 되는 동안 같은 인스턴스에 접근하게 되면 어떻게 될까?
객체지향, 절차지향 프로그래밍의 프로그램 처리 과정에서는 결과에 큰 영향을 미칠 것 입니다.
함수형 프로그래밍에서는 순수하게 함수에 전달되고 그에 의해 처리 된 결과만을 중요하게 생각할 것 입니다.
이렇게 됬을 경우 어떤 많은 처리가 필요할 때 서로에게 독립적으로 작동하기에 부작용이 없어지게 될 것 입니다.
이렇듯 함수형 프로그래밍 패러다임을 차용하면 병렬처리에서 큰 강점이 있습니다.
클로저란 어떤 기능을 하는 코드를 하나의 블럭으로 모아놓은 것을 의미합니다.
따라서 함수도 클로저의 한 형태라고 볼 수 있습니다.
{ (매개변수) -> 반환타입 in
코드 블럭
}
// 이름 변수
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
// 함수 형태
func backward(_ s1: String, _ s2: String) -> Bool {
return s1 > s2
}
let reversedNames = names(by: backward)
// 클로저 사용
let reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
return s1 > s2
})
// 반환 타입 유추, 매개변수 타입 유추 경우
let reversedNames = names.sorted(by: { (s1, s2) in
return s1 > s2
})
// 매개변수 생략
// $0, $1, $2, $3, .... 등을 이용해 매개변수를 선언할 필요도 없음
// 이렇게 되면 실행 코드와 매개변수 구분을 위해 사용했던 in을 사용할 필요도 없음
let reversedNames = names.sorted(by: {
return $0 > $1
})
// return 키워드 생략
// return 키워드 조차 문맥을 통해 마지막 줄이 return으로 유추 가능
let reversedNames = names.sorted(by: { $0 > $1 })
// 후행 클로저
// (by: ) 소괄호를 없앰
let reversedNames = names.sorted { $0 > $1 }