새소식

iOS/SwiftUI

[SwiftUI] Do, Try, Catch, Throw 구문

  • -

[참고 영상]

https://youtu.be/ss50RX7F7nE

[학습 목표]

너무나도 익숙한 if else 구문이 아닌 예외처리를 잡기 위해 Try 와 Throws 에 대해서 배워보자.

[구현 방법]

do {
            try <#throwing expression#>
        } catch <#pattern#> {
            <#statements#>
        }

do 구문의 경우에는 do 와 catch를 이용해서 잡는다. 다만 이 때 try에 쓰여있는 문장 중에서 false가 발생한다면 해당 문장 이후를 확인하지 않고 catch로 넘어간다.

만일, 이와 같이 넘어가는 경우를 잡고 싶다면

try?

try뒤에 ?를 붙임으로서 옵셔널을 적용시켜주자. 이렇게 된다면 해당 구문이 false가 나오더라도 문장을 전부 읽어보고 true가 나오는 곳에서 반환을 해 줄수가 있다.

[예시]

[전체 코드]

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import SwiftUI
 
class DoCatchTryThrowBootcampDataManager {
    
    let isActive: Bool = true
    
    func getTitle3() throws -> String {
//            해당 부분에 주석처리를 통해 true값을 반환 안시키게 만들었음.
//        if isActive{
//            return "NEW Text!"
//        } else {
            throw URLError(.badServerResponse)
//        }
    }
    
    func getTitle4() throws -> String {
        if isActive{
            return "Final Text!"
        } else {
            throw URLError(.badServerResponse)
        }
    }
}
 
class DoCatchTryThrowBootcampViewModel: ObservableObject {
    
    @Published var text: String = "Starting text."
    let manager = DoCatchTryThrowBootcampDataManager()
    
    func fetchTitle(){
        
        let newTitle = try? manager.getTitle3()
        if let newTitle = newTitle {
            self.text = newTitle
        }
            
        do {
            //do 구문에서 위에가 false가 된다면 밑의 부분이 실행 안되고 catch 구문으로 넘어간다.
            let newTitle = try? manager.getTitle3()
            if let newTitle = newTitle{
                self.text = newTitle
            }
            //try 뒤에 ?(옵셔널)을 준다면 newTitle 에서 받아오는 string도 자동으로 옵셔널이 된다.
//            self.text = newTitle
            //만일 getTitle3가 오류나더라도 getTitle4가 실행되는 모습을 볼 수가 있다.
 
            let finalTitle = try manager.getTitle4()
            self.text = finalTitle
        } catch let error { // 여기서 let error를 제외해도 괜찮음.
            self.text = error.localizedDescription
        }
    }
}
 
struct DoCatchTryThrowBootcamp: View {
    @StateObject private var viewModels = DoCatchTryThrowBootcampViewModel()
    var body: some View {
        Text(viewModels.text)
            .frame(width: 300, height: 300)
            .background(Color.blue)
            .onTapGesture {
                viewModels.fetchTitle()
            }
    }
}
 
struct DoCatchTryThrowBootcamp_Previews: PreviewProvider {
    static var previews: some View {
        DoCatchTryThrowBootcamp()
    }
}
 
cs
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.