iOS/Swift

함수 3편 (중첩 함수)

밤새는 탐험가89 2024. 1. 15. 20:03

 

중첩 함수 

스위프트는 함수 내부에 또 다른 함수를 생성 가능.

외부 함수의 생성과 소멸을 내부 함수는 같이 함

 

 

중첩 함수의 사용 

func outerFunction() {
    print("Outer Function")
    
    func innerFunction() {
        print("Inner Function")
    }
}

outerFunction()
// Outer Function

 

 

 

만약에 외부에서 innerFunction()에 접근한다면?

범위내에서 찾을 수 없다는 오류 발생

innerFunction()
//  cannot find 'innerFunction' in scope

 

 

 

그럼 내부 함수도 실행하고 싶다면?

func outerFunction() -> () -> () {
    print("Outer Function")
    
    func innerFunction() {
        print("Inner Function")
    }
    
    return innerFunction
}

let check = outerFunction()
check()

// Outer Function
// Inner Function

 

 

 

여기서 outerFunction 함수를 보면

() 는 빈 값을 뜻하고,

() -> () 리턴하고자 하는 함수의 타입을 말함 

 

func outerFunction() -> () -> ()

 

 

 

outerFunction 함수의 리턴 값을 받아서 실행하면

inerrFunction 함수의 출력값도 반환됨 

let check = outerFunction()
check()

// Outer Function
// Inner Function

 

 

 

★여기서 check이라는 변수에는 outerFunction 함수의 결과 값을 대입하는게 아니라 

함수 타입을 저장함 이때, 함수에 전달인자 레이블은 작성하지 않음  ★

 

 

 

중첩함수 사용

typealias UpDownFunc = (Int) -> Int			// 타입 별칭

func funcForMove(shouldGoUP: Bool) -> UpDownFunc {	// 반환 타입이 함수
    
    func goUp(currentFloor: Int) -> Int {
        return currentFloor + 1
    }
    
    func goDown(currentFloor: Int) -> Int {
        return currentFloor - 1
    }
    
    return shouldGoUP ? goUp : goDown
}

var currentFloor: Int = 10

var targetFloor: Int = 8

let moveToTarget: UpDownFunc = funcForMove(shouldGoUP: currentFloor<targetFloor)

while currentFloor != targetFloor {
    print("현재 \(currentFloor) 층...")
    currentFloor = moveToTarget(currentFloor)
}

print("띵! \(currentFloor)층 도착.")


// 현재 10 층...
// 현재 9 층...
// 띵! 8층 도착.

'iOS > Swift' 카테고리의 다른 글

구조체  (0) 2024.01.17
옵셔널  (0) 2024.01.16
함수 2편 (매개변수, 데이터 타입)  (0) 2024.01.14
함수 1편 (함수 정의 및 호출)  (0) 2024.01.14
흐름 제어 (반복문)  (0) 2024.01.12