나의 기록, 현진록

[Swift] 7.3 중첩함수 7.4 종료되지 않은 함수 7.5 반환을 무시하는 함수 본문

Programming/Swift

[Swift] 7.3 중첩함수 7.4 종료되지 않은 함수 7.5 반환을 무시하는 함수

guswlsdk 2021. 7. 13. 11:38
반응형

스위프트 프로그래밍 3판 - 야곰 지음

 

7.3 중첩함수

swift는 데이터 타입의 중첩이 자유롭다. 열거형 안에 열거형, 클래스 안에 또 다른 클래스 구현이 가능하여 다른 프로그래밍 언어에서는 생각하지 못 했던 패턴을 자유롭게 만들어볼 수 있다.

 

 

 

[Swift] 7 함수 / 함수 정의와 호출 / 매개변수

스위프트 프로그래밍 3판 - 야곰 지음 7.1 함수와 메서드 함수와 메서드는 기본적으로 같다. 다만 상황이나 위치에 따라 다른 용어로 부르는 것뿐이다. 메서드 : 구조체, 클래스, 열거형 등 특정

wisetrue.tistory.com

함수의 중첩은 함수 안에 함수를 넣을 수 있다는 의미인데 이전 글에서 사용했던 함수는 특별한 위치에 속해 있지 않는 한 모두 전역함수이다. 즉, 모듈 어디서든 사용할 수 있는 함수라는 뜻.

 

그러나 함수 안의 함수로 구현된 중첩 함수는 상위 함수의 몸통 블록 내부에서만 함수를 사용할 수 있습니다. 물론 중첩 함수의 사용 범위가 해당 함수 안쪽이라고 해서 아예 외부에서 사용할 수 없는 것은 아니다. swift에서는 함수 또한 함수의 반환 값으로 사용될 수 있으므로 중첩함수를 담은 함수가 중첩 함수를 반환하면 외부에서도 사용 가능하다.

 

 

 

-2 -1 0 1 2

 

원점이 0이고 좌로는 음수, 우로는 양수로 이루어진 보드이다. 원점으로 이동하기 위한 함수를 구현해보자.

 

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

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

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

var position = 3

let moveToZero: (Int) -> Int =  functionForMove(position > 0)
while position != 0 {
    print("\(position)...")
    position = moveToZero(position)
}
print("원점 도착")

 

 

중첩 함수를 사용하지 않고 지금까지 우리가 함수를 구현하던 방식이다. 하지만 왼쪽 오른쪽을 이동하는 기능은 사소한 기능일 뿐 원점을 찾아가는 목적은 같기 때문에 굳이 전역으로 구현할 필요가 없다.

 

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

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

    return shouldGoLeft ? goLeft : goRight
}

var position = 3

let moveToZero: (Int) -> Int =  functionForMove(position > 0)
while position != 0 {
    print("\(position)...")
    position = moveToZero(position)
}
print("원점 도착")

 

결과는 같다. 전역 함수가 많은 큰 프로젝트에서는 전역으로 사용하는 것을 굳이 필요하지 않다면 이렇게 정리하여 깔끔하게 표현할 수 있다.

 

 

 

7.4 종료되지 않은 함수

 

swift에는 종료되지 않은 함수가 있다.

 

종료되지 않는다는 의미는 정상적으로 끝나지 않은 함수라는 뜻. 이를 비반환 함수 또는 비반환 메소드라고 하는데 정상적으로 끝날 수 없는 함수인 것이다. 이 함수를 실행하면 프로세스 동작은 끝났다고 볼 수 있다. 

 

비반환 함수의 역할은 오류를 던지거나, 중대한 시스템의 오류를 보고하는 등의 일을 하고 프로세스를 종료해 버리기 때문이다. 비반환 함수는 어디서든 호출 가능하고 guard 구문의 else 블록에서도 호출 가능하다. 비반환 함수는 재정의할 수 있지만 비반환 타입이라는 것을 변경할 수 없습니다. 

 

타입은 Never라고 명시하면 된다.

 

 

func crashAndBurn() -> Never{
    fatalError("Something very, very bad happened")
}

crashAndBurn() // 프로세스 종료 후 오류 보고

func someFunction(isAllIsWell: Bool){
    guard isAllIsWell else {
        print("마을에 도둑이 들었습니다!")
        crashAndBurn()
    }
    print("All is well")
}


someFunction(isAllIsWell: true) // All is well
someFunction(isAllIsWell: false) // 마을에 도둑이 들었습니다!

 

7.5 반환 값을 무시할 수 있는 함수

 

가끔 함수의 반환 값이 꼭 필요하지 않은 경우가 있다. 프로그래머가 의도적으로 함수의 반환 값을 사용하지 않을 경우 컴파일러가 함수의 결과 값을 사용하지 않았다는 경고를 보낼 때도 있습니다. 이런 경우 함수의 반환 값을 무시해도 된다는 @discardableResult 선언 속성을 사용하면 됩니다.

 

func say(_ something: String) -> String{
    print(something)
    return something
}

@discardableResult func discardableResultSay(_ something: String) -> String{
    print(something)
    return something
}

say("hello")

discardableResultSay("hello")

say("hello")는 반환값을 사용하지 않았다고 컴파일러가 경고를 표시하지만 @discardableReslt 선언 속성을 사용한 경우 경고 메시지가 출력되지 않는다.

반응형

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

[Swift] 8.2.2 옵셔널 바인딩  (0) 2021.07.14
[Swift] 8.1 옵셔널  (0) 2021.07.13
[Swift] 7 함수 / 함수 정의와 호출 / 매개변수  (0) 2021.07.12
[Swift] 6.1.2 switch 구문  (0) 2021.07.05
[Swift] 4.5.5 순환 열거형  (0) 2021.07.02