Never 타입
- 제어권을 호출한 위치로 return하지 않는다.
- Never타입은 빈 열거형으로 선언되어있다.
- 빈 열거형이므로 인스턴스를 생성할 수 없다
- ex) let day: Weekday = Weekday.monday // 인스턴스 생성 불가
- let some = Never() // 생성 불가
⭐️함수의 return의 의미⭐️
- 함수의 결과로 만들어진 값을 리턴한다.
- 함수 내부로 전달된 CPU실행의 제어권을 함수를 호출한 부분으로 돌려준다.
❓일반적인 함수의 흐름
//코드위치
func addTwoNumbers(a: Int, b: Int) -> Int { //1
var c = a + b //2
return c //3
}
//@main
var num1 = 5 //4
var num2 = 3 //5
var num3 = addTwoNumbers(a: num1, b: num2) //6
print(num3) //7
일반적인 코드의 흐름은 main으로부터 시작된다.
4번, 5번, 6번이 실행되고 6번에서 실행된 addTwoNumbers의 정의부분인 1번으로 이동하여 1, 2, 3번일 실행될것이다.
이 때 3번에서 return이 일어나게되고 c와 CPU의 제어권을 6번 코드로 return하게 된다.
❓Never타입과 CPU제어권을 NonReturning하는 함수
//코드위치
func addTwoNumbers(a: Int, b: Int) -> Never { // 1
fatalError("앱이 해킹됨") // 2
}
//@main
var num1 = 5 // 3
var num2 = 3 // 4
var num3 = addTwoNumbers(a: num1, b: num2) // 5
print(num3) // 6
addTwoNumbers 함수는 Nonreturning 함수가 되었다
명시적으로 제어권을 전달하지 않는다는 것을 표시하기 위해 Never(네버)타입으로 선언되었다.
함수의 흐름을 보자.
3, 4번 코드가 실행되고 5번코드에서 addTwoNumbers가 호출된다.
1번으로 이동하지만 이는 Nonreturning함수이기 때문에 5번코드로 CPU의 제어권을 돌려주지 않는다.
fatalError()함수 또한 Never를 리턴하는 함수로 내부가 정의되어있다.
그러므로 6번 코드는 실행되지 못하고 종료된다
fatalError()함수의 선언부
public func fatalError(_ message: @autoclosure () -> String = String(),
file: StaticString = #file, line: UInt = #line) -> Never
// message: 에러가 발생할 때 표시하려고 하는 메시지(콘솔)
// file: (에러발생) 파일 이름
// line: (에러발생) 라인번호
// 리턴타입: Never 타입
사용하는 이유⭐️
- 런타임에 발생할 수 있는 에러를 미리 발견하고 검증/테스트 하기 위해
- 심각한 에러가 발생하면 앱을 종료시키기 위해