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()
}
}