중첩함수

  • 중첩함수란? 함수 내에 다른 함수를 작성하여 사용하는 것
  • 함수 내부에 작성하는 함수에는 제한이 없다.
  • 외부 함수의 경우 프로그램과 생사를 같이하며 내부 함수의 경우 외부 함수와 생사를 같이 한다.
  • 내부 함수는 외부 함수를 거치지 않고서는 접근할 수 없다. 이를 통해 외부의 코드로부터 차단할 수 있으며 이를 함수의 은닉성이라고 한다.
func outer() -> String {
    func inner() -> String {
        return "inner 함수의 리턴"
    }
    return inner()
}

print(outer()) //inner 함수의 리턴
  • 그러나 다음과 같은 경우 함수의 은닉성을 해제하고 내부 함수의 생명 주기를 변경할 수 있다.
func outer(inputValue01: Int) -> (Int) -> String {
    func inner(inputValue02: Int) -> String {
        return "결과값은 \(inputValue01 + inputValue02) 입니다."
    }
    return inner
}

let case01 = outer(inputValue01: 10) //outer 함수의 결과로 inner 함수가 할당된다.
let case02 = case01(5) //결과값은 15 입니다.
  • 위 경우, case01에 내부 함수가 할당되어 outer 함수가 종료되어도 계속해서 사용이 가능하다.
  • 만약 내부 함수가 외부 함수의 지역 상수 혹은 지역 변수를 참조하고 있다면 소멸되지 않는다.

익명함수(closure)

  • 클로저는 함수를 작성하는 키워드인 func와 함수명을 생략하여 작성한다.
  • 클로저의 시작은 중괄호({) 이며, 일반 함수의 블록은 in 으로 대체된다.
var a = { () -> () in
    print("클로저가 실행된다")
}() //클로저가 실행된다
  • 클로저는 상황에 따라 축약이 가능하다.
var array: [Int] = [1, 4, 2, 7, 3]

array.sort(by: {(s1: Int, s2: Int) -> Bool in
    if s1 > s2 {
        return true
    } else {
        return false
    }
}) //[7, 4, 3, 2, 1]

array.sort(by: {(s1: Int, s2: Int) -> Bool in return s1 > s2}) //[7, 4, 3, 2, 1]

array.sort(by: {(s1: Int, s2: Int) in return s1 > s2}) //[7, 4, 3, 2, 1] -> 반환값 생략

array.sort(by: {s1, s2 in return s1 > s2}) //[7, 4, 3, 2, 1] -> 매개변수의 타입 생략

array.sort(by: {return $0 > $1}) //[7, 4, 3, 2, 1] -> 매개변수를 생략

array.sort(by: >) //[7, 4, 3, 2, 1] -> 연산자 함수만을 사용