으니의 개발로그

[Swift] 함수(5) - 중첩 함수 본문

Swift/책 정리

[Swift] 함수(5) - 중첩 함수

아잉으니야 2021. 1. 29. 21:01

[Swift] 함수(5) - 중첩 함수

이 글은 Swift 프로그래밍 책을 읽고 요약한 내용입니다.

 

 

함수의 중첩은 함수 안에 함수를 넣을 수 있다는 의미이다. 함수 안의 함수로 구현된 중첩 함수는 상위 함수의 블록 내부에서만 함수를 사용할 수 있다. 그렇다고 중첩 함수를 아예 외부에서 사용할 수 없는 것은 아니다. 함수에서 하나의 반환 값으로 중첩 함수를 반환하면 밖에서도 사용할 수 있다.

 

typealias MoveFunc = (Int) -> Int

func goRight(_ currentPosition: Int) -> Int {
    return currentPosition + 1
}

func goLeft(_ currentPosition: Int) -> Int {
    return currentPosition - 1
}

func functionForMove(_ shouldGoLeft: Bool) -> MoveFunc {
    return shouldGoLeft ? goLeft : goRight
}

var position: Int = 3   // 현 위치

// 현 위치가 0보다 크므로 전달되는 인자 값은 true가 됨
// 그러므로 goLeft(_:) 함수가 할당될 것이다.
let moveToZero: MoveFunc = functionForMove(position > 0)
print("원점으로 갑시다.")

// 원점에 도착하면(현 위치가 0이면) 반복문이 종료된다.
while position != 0 {
    print("\(position)...")
    position = moveToZero(position)
}
print("원점 도착!")
/*
 원점으로 갑시다.
 3...
 2...
 1...
 원점 도착!
*/

 

위의 코드를 중첩 함수를 사용해서 나타낸 코드

typealias MoveFunc = (Int) -> Int

func functionForMove(_ shouldGoLeft: Bool) -> MoveFunc {
    func goRight(_ currentPosition: Int) -> Int {
        return currentPosition + 1
    }

    func goLeft(_ currentPosition: Int) -> Int {
        return currentPosition - 1
    }

    return shouldGoLeft ? goLeft : goRight
}

var position: Int = -4   // 현 위치

// 현 위치가 0보다 작으므로 전달되는 인자 값은 false가 됨
// 그러므로 goRight(_:) 함수가 할당될 것이다.
let moveToZero: MoveFunc = functionForMove(position > 0)
print("원점으로 갑시다.")

// 원점에 도착하면(현 위치가 0이면) 반복문이 종료된다.
while position != 0 {
    print("\(position)...")
    position = moveToZero(position)
}
print("원점 도착!")
/*
 원점으로 갑시다.
 3...
 2...
 1...
 원점 도착!
*/