Swift의 do, try, catch 구문은 에러 처리를 위한 구문이다. 보통 아래와 같은 형태를 많이 발견할 수 있다.
do { // 예외가 발생할 수 있는 코드를 포함하는 블록
try // 예외가 발생할 수 있는 작업을 호출
} catch {
// 예외가 발생했을 때 처리할 코드
}
코드 실습
아래와 같은 코드가 있다고 해보자. fetch 함수는 "Fetched" 를 반환하는 함수이다. 이 함수는 throws 를 통해 에러를 던지는 함수라는 것을 알 수 있다. isActive 를 받아서 false 면 에러를 던진다.
enum fetchError: Error {
case unknown
case network
}
func fetch(_ isActive: Bool) throws -> String {
if isActive {
return "Fetched"
} else {
throw fetchError.unknown
}
}
위의 화면은 아래와 같은 코드로 구사할 수 있다. fetch 를 누르면 nil 이 Fetched 로 바뀐다.
import SwiftUI
struct ContentView: View {
@State private var text: String?
var body: some View {
VStack {
if let text = text {
Text(text)
} else {
Text("nil")
}
// do try catch 를 사용하는 부분
Button("fetch") {
do {
text = try fetch(true)
} catch {
print("error: \(error.self)")
}
}
.buttonStyle(.bordered)
}
.font(.largeTitle)
}
}
하지만 text = try fetch(false) 가 되어 에러를 반환한다면?
내가 설정한 unknown 에러를 반환한다. 이 구문을 예외상황이 발생할 수 있는 곳에 활용하면 좋을듯 하다.
try?
try? 를 사용하게 된다면 에러와 상관없이 "Fetched" 를 반환하거나 nil 을 반환한다. 만약 아래와 같이 만든다면 error 가 나오지 않고 뷰에 아무 변화도 없게 된다.
struct ContentView: View {
@State private var text: String?
var body: some View {
VStack {
if let text = text {
Text(text)
} else {
Text("nil")
}
Button("fetch") {
text = try? fetch(false)
}
.buttonStyle(.bordered)
}
.font(.largeTitle)
}
}
'→ Swift Study' 카테고리의 다른 글
[Swift] 명령형, 선언형 프로그래밍과 SwiftUI가 struct인 이유 (0) | 2024.10.23 |
---|---|
[Swift] @State, @Binding? (1) | 2024.10.23 |
[Swift] 약한참조 (weak self) Swift 로 실습해보기 (0) | 2024.01.21 |
[Swift] GCD 알아보기 4 - 동시성 관련 문제 (0) | 2024.01.11 |
[Swift] GCD 알아보기 3 - DispatchGroup (0) | 2024.01.11 |