기존의 C, C++에서는 함수안에서 다른 함수를 호출하는 것이 일반적이었습니다. 그러나 Swift에서는 함수 안에 함수를 넣어 구현을 할 수 있습니다.
Swift에서 특별한 위치에 속해 있지 않는 한 모두 전역 함수
So → 특히 전역함수가 많은 프로그램에서는 중첩함수를 이용하면 함수 사용범위를 좀 더 명확하게 표현해줄 수 있는 장점
@discardableResult func myWeight(weight: Int) -> Int {
lazy var weightChange: Int = weight
func diet(weight: Int) {
weightChange = weight - 10
print("다이어트를 해서 10kg로 빠져 \\(weightChange)가 되었어요!")
}
func bulkUp(weight: Int) {
weightChange = weight + 10
print("벌크업을 해서 10kg로 쪄서 \\(weightChange)가 되었어요!")
}
(weight > 80) ? diet(weight: weight) : bulkUp(weight: weight)
return weightChange
}
myWeight(weight: 90) // 다이어트를 해서 10kg로 빠져 80가 되었어요!
myWeight(weight: 60) // 벌크업을 해서 10kg로 쪄서 70가 되었어요!
종료되지 않는다는 것은 return 되지않고 비정상적으로 끝나는 함수를 뜻합니다. 오류를 던지고 중대한 시스템 오류를 보고한 후 프로세스를 종료하기 위해서 생겨났습니다. 비반환 함수는 어디서든 호출이 가능하고 반환타입을 Never로 명시하여 정의합니다.
가장 대표적인 예시는 fatalError이다! fatalError는 호출 즉시 크래시를 발생시키고 이때 반환타입으로 Never을 활용해서 비반환함수를 구현할 수 있다.
가끔 함수의 반환 값이 굳이 필요하지 않는 경우가 있다. 이런 경우 함수의 반환값을 무시해도 된다는 @discardableResult 키워드를 붙여서 프로그래머가 의도적으로 반환값을 사용하지 않을 수 있다.
func sayHello() -> String {
print("안녕 나의 기여밍")
return "hello"
}
@discardableResult func sayHelloWithDiscardable() -> String {
print("안녕 나의 기여밍")
return "hello"
}
sayHello() //⚠️ Result of call to 'sayHello()' is unused (경고문) -> 출력이 되긴 함
sayHelloWithDiscardable() // "안녕 나의 기여밍"
→ 위에 3개의 항목을 합친 코드를 짜보세요!