Clousre를 이용해서 VC간 데이터 주고받기

작성일

우선 간단하게 클로져부터 설명을 해본다면

Closure란?

  • 클로저는 사용자의 코드 안에서 전달되어 사용할 수 있는 로직을 가진 중괄호“{}”로 구분된 코드의 블럭이며, 일급 객체의 역할을 할 수 있다.
  • 일급 객체는 전달 인자로 보낼 수 있고, 변수/상수 등으로 저장하거나 전달할 수 있으며, 함수의 반환 값이 될 수도 있다.
  • 참조 타입이다.
  • 함수는 클로저의 한 형태로, 이름이 있는 클로저이다.
  • 그떄그때 필요한 코드를 작성하여 사용할 수 있도록 만든 코드.

Closure의 표현 문법

{ (parameters) -> return type in
    statements
}

작동방식

화면1에서 장바구니를 클릭 -> 화면2에서 상품을 선택 -> 화면 1에서 상품의 개수를 띄우는 alert창 생성. image

  • 데이터 요청을 받은 Received View Controller에서 Closure 선언
    아이템 개수를 전달해주니까 Int -> Void 형태로 선언
    var closure: ((Int) -> ())?        // 클로저 선언
    
  • 장바구니 담기 버튼을 클릭했을때
    클로저를 실행하면서 장바구니에 몇개가 담겼는지 파라미터로 전달해준다.
    @IBAction func insertCartButtonTapped(_ sender: UIButton) {
          dismiss(animated: true, completion: nil)
          closure?(itemCount)
      }
    
  • 카트 버튼 클릭했을 때 클로저를 실행해준다 버튼이 눌리면 closure가 실행되도록! 두번째 뷰컨트롤러(Received ViewController) 가 dismiss되고 closure?를 호출하면 첫번째 뷰컨트롤러( Send View Controller )에 clousre를 실행해준다. ~~~ @IBAction func cartButtonTapped() { let cartVC = storyboard?.instantiateViewController(identifier: “ReceiveViewController”) as! ReceiveViewController

      cartVC.closure = { itemCount in
          let alertVC = UIAlertController(title: "장바구니 확인", message: "장바구니에 \(itemCount)개의 상품이 추가되었습니다.", preferredStyle: .alert)
            
          let okAction = UIAlertAction(title: "확인", style: .default, handler: nil)
          alertVC.addAction(okAction)
            
          self.present(alertVC, animated: true, completion: nil)
      }
        
      if let productName = productNameLabel.text,
         let price = priceLabel.text {
          cartVC.productName = productName
          cartVC.price = price
      }
      present(cartVC, animated: true, completion: nil)   }
    

~~~