class EscapingViewModel: ObservableObject {
@Published var text: String = "Hello"
func getData() {
let newData = downloadData()
text = newData
}
func downloadData() -> String {
return "New Data!"
}
}
struct EscapingBootcamp: View {
@StateObject var vm = EscapingViewModel()
var body: some View {
Text(vm.text)
.font(.largeTitle)
.fontWeight(.semibold)
.foregroundColor(.blue)
.onTapGesture {
vm.getData()
}
}
}
요런 downloadData2 메소드가 있다고 했을 때 지금 어느정도의 시간 후에 data가 넘어와서 -> String이 바로 반환이 안됨!
그래서 에러가 뜨죠?
string을 받는 completionHandler를 선언해줬습니다
근데 이렇게 하니까 또 getData에서 에러가 뜨죠
반환 값이 없는 경우 Void 혹은 ()로 명시해줄 수 있고,
보통 생략하지만 closure를 사용할 때는 작성해주게 됨
downloadData3를 작성하고 dispatchQueue.main.asyncAfter로 딜레이를 주려고 하면 또 에러 발생!
클로져 앞에 @escaping을 붙여줘야 합니다!!!
그럼 getData가 이런식으로 바껴야 하고
Strong Reference까지 방지 해주면 뙇!
클로져 작성할 때 타입만 작성하는 것도 가능!
캬!!!!
타입앨리어스 까지 쓰면 엄청 깔끔해지죠 코드