[Swift]クロージャで画面を閉じる時に値を受け渡す

FirstVC -> SecondVC に値を受け渡すのは以下です。

import UIKit

class FirstVC: UIViewController {
   var num1: Int?

   override func viewDidLoad() {
       super.viewDidLoad()
   }

   @IBAction func goSecondVC(_ sender: Any) {
       let secondVC = storyboard?.instantiateViewController(withIdentifier: "SecondVC") as? SecondVC
       if let secondVC = secondVC {
           secondVC.num2 = 2 //値を受け渡す
           present(secondVC, animated: true, completion: nil)
       }
   }
}
import UIKit

class SecondVC: UIViewController {
   var num2: Int?
   
   override func viewDidLoad() {
       super.viewDidLoad()
   }
   @IBAction func closeButton(_ sender: Any) {
       dismiss(animated: true, completion: nil)
   }
}

storyboardからSecondVCを取得して、そのプロパティに値をセットする方法です。

では、SecondVC -> FirstVC に戻る時に値を受け渡す時は、

storyboardからFirstVCを取得すると遷移前のFirstVCとは別に新しくインスタンスが作られ、遷移前のFirstVCは取得できません。

この問題を解決するのがクロージャです。

以下コードです。

import UIKit

class FirstVC: UIViewController {
   var num1: Int?

   override func viewDidLoad() {
       super.viewDidLoad()
   }

   @IBAction func goSecondVC(_ sender: Any) {
       let secondVC = storyboard?.instantiateViewController(withIdentifier: "SecondVC") as? SecondVC
       if let secondVC = secondVC {
           secondVC.num2 = 2 //値を受け渡す
           //SecondVCのclosureを定義
           ② secondVC.closure = {(num: Int) -> Void in
               self.num1 = num
           }
           present(secondVC, animated: true, completion: nil)
       }
   }
}
import UIKit

class SecondVC: UIViewController {
   var num2: Int?var closure: ((Int) -> Void)?
   
   override func viewDidLoad() {
       super.viewDidLoad()
   }
   @IBAction func closeButton(_ sender: Any) {
      ③ closure?(1) //値を受け渡す
       dismiss(animated: true, completion: nil)
   }
}

① SecondVCにclosureプロパティを追加します。型は (Int) -> Void です。引数のIntに受け渡したい値をセットします。

② FirstVCで、SecondVCのclosureの処理を定義します。

③ 値を受け渡したい時にclosureを実行します。

これで値が受け渡されます。

いいなと思ったら応援しよう!