일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 재귀
- 큐
- c언어
- SWiFT
- Java
- windosws wbcs
- level13
- War Game
- ftz level13
- 두근두근 자료구조
- 미로 탐색 알고리즘
- web
- OSI
- 백준
- windosw 문자열
- 자료구조
- 파이썬
- LoB
- C
- System
- pwnable.kr
- 정렬 알고리즘
- Stack
- 암호수학
- 스택
- 파일 시스템
- HTML
- ftz
- 시간복잡도
- PHP
- Today
- Total
나의 기록, 현진록
[Swift] 7.3 중첩함수 7.4 종료되지 않은 함수 7.5 반환을 무시하는 함수 본문
스위프트 프로그래밍 3판 - 야곰 지음
7.3 중첩함수
swift는 데이터 타입의 중첩이 자유롭다. 열거형 안에 열거형, 클래스 안에 또 다른 클래스 구현이 가능하여 다른 프로그래밍 언어에서는 생각하지 못 했던 패턴을 자유롭게 만들어볼 수 있다.
함수의 중첩은 함수 안에 함수를 넣을 수 있다는 의미인데 이전 글에서 사용했던 함수는 특별한 위치에 속해 있지 않는 한 모두 전역함수이다. 즉, 모듈 어디서든 사용할 수 있는 함수라는 뜻.
그러나 함수 안의 함수로 구현된 중첩 함수는 상위 함수의 몸통 블록 내부에서만 함수를 사용할 수 있습니다. 물론 중첩 함수의 사용 범위가 해당 함수 안쪽이라고 해서 아예 외부에서 사용할 수 없는 것은 아니다. 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 |