
struct Diff: View {
@State var inputNumber = ""
@State var resultNumber: Float = 0
var body: some View {
VStack{
TextField("나눌 숫자를 입력하세요", text: $inputNumber)
Text("나눈 결과는 다음과 같습니다. \(resultNumber)")
Button{
do { // 일단 아래의 코드를 실행하고
try resultNumber = devideTen(with: (Float(inputNumber) ?? 1.0))
} catch DivideError.diviedByZero{ // 오류 발생시 특정 오류 캐치 (미리 정의한 에러)
print("0으로 나누었어요")
resultNumber = 0
} catch { // 그 외의 오류
print("알수 없는 오류가 발생되었어요")
}
}label: {
Text("나누기")
}
}
}
// throws를 명시한 함수 -> 문제가 발생할 가능성이 있는 함수임을 명시
func devideTen(with inputNumber: Float) throws -> Float {
var result: Float = 0
if inputNumber == 0 {
// error (오류 발생시 예외 던지기
throw DivideError.diviedByZero
}else{
result = 10 / inputNumber
}
return result
}
}
// 에러(예외)는 직접 정의할 수 있다.
enum DivideError: Error {
case diviedByZero
}
throw, try, catchtry-catch 가 아닌 do-catch 형식을 사용한다.try 키워드를 다양하게 사용할 수 있다.try : 오류를 던질 수 있는 함수(throws가 명시된 함수)를 호출할 때 사용한다. → 이 경우 반드시 do-catch 구문으로 처리하거나 try? 혹은 try! 으로 처리해야한다.try? : 만약, 함수에서 오류가 발생하면 nil을 반환한다. do-catch 구문을 정의할 필요 없이 간단하게 오류를 무시하고 nil을 반환시킬 수 있다.let result = try? divide(10, 0) // 오류가 발생하면 nil이 반환try! : 함수 호출이 오류 없이 반드시 성공한다고 확신할 때 사용한다. → 만약, 오류가 발생하면 앱이 크래시된다. 💣let result = try! divide(10, 2) // 오류가 발생하지 않는다고 가정throws 를 활용하여 오류를 던질 수 있는 함수(오류가 발생할 가능성이 있는 함수)를 정의한다. // throws를 명시한 함수 -> 문제가 발생할 가능성이 있는 함수임을 명시
func devideTen(with inputNumber: Float) throws -> Float {
var result: Float = 0
if inputNumber == 0 {
// error (오류 발생시 예외 던지기
throw DivideError.diviedByZero
}else{
result = 10 / inputNumber
}
return result
}
do-catch 를 활용하여 do 블록 내에서 오류가 발생할 수 있는 코드를 실행하고, catch 블록에서 이를 처리한다. Button{
do { // 일단 아래의 코드를 실행하고
try resultNumber = devideTen(with: (Float(inputNumber) ?? 1.0))
} catch DivideError.diviedByZero{ // 오류 발생시 특정 오류 캐치 (미리 정의한 에러)
print("0으로 나누었어요")
resultNumber = 0
} catch { // 그 외의 오류
print("알수 없는 오류가 발생되었어요")
}
}label: {
Text("나누기")
}
Error 프로토콜을 채택(Adopt)한 열거형을 통해 개발자가 직접 오류를 정의할 수 있다.정의된 오류는 자신이 만든 함수나 메서드에 던져 처리할 수 있다.
→ 즉, 기본 제공되는 예외들을 사용하지 않고도 개발자가 필요에 따라 오류를 정의하고 처리할 수 있다!
enum MyError: Error {
case divisionByZero
case invalidInput
}
// MyError 열거형은 Error 프로토콜을 "채택" 한다.
프로토콜 채택과 클래스 상속은 엄연히 다른 개념이니 유의하자.