Escaping Closure

Woozoo·2023년 4월 29일
0

[Whatis]

목록 보기
6/8

Escaping Closure

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까지 방지 해주면 뙇!



클로져 작성할 때 타입만 작성하는 것도 가능!


캬!!!!
타입앨리어스 까지 쓰면 엄청 깔끔해지죠 코드


Codable

profile
우주형

0개의 댓글

관련 채용 정보