[Swift] Unwind segue の使い方

#はじめに
アプリ作成に欠かせない画面遷移関係でUnwind segueを使ったので、自分なりにまとめてみようと思います。
初めてこの名前を聞いた時かなり難しそうに思いましたが、コードはかなりシンプルでした。
#使い所
+ ２つ以上前の画面に戻りたい時
+ 画面遷移時に何らかの処理を行いたい時

#実装してみた
####何個か先の画面から戻ってくるものを作ってみる
下の写真のようにviewを用意し、緑の画面から青の画面に戻ってくるようにコードを書いていきます。
![スクリーンショット 2020-12-26 16.08.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755375/cd410171-b5d0-8b75-0b87-8e4965f33c03.png)
####青い画面のViewControllerのコード
Unwind segue　を使用するためには、戻って来たい画面に以下のコードを書きます。
` @IBAction func bluesegue(segue: UIStoryboardSegue) {}`
この関数名は各自設定してみてください。
実はコードはこれだけになります。

```swift
class ViewController: UIViewController {

    @IBAction func bluesegue(segue: UIStoryboardSegue) {
    }
}
```

####storyboard上でUnwind segueを設定
緑の画面のThirdViewControllerのボタンから青の画面に戻るように設定します。
ボタンからcontrolを押しながら、画像の赤枠のマークのExitにドラック&ドロップします。
![スクリーンショット 2020-12-26 16.29.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755375/13266dde-95e0-c3fd-6ce9-ada2abc4d0ec.png)

先程設定した関数の名前が表示されるので、それをクリックします。これで紐付け完了です。
![スクリーンショット 2020-12-26 16.24.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755375/ad05a237-11ee-ab4b-c54e-e37870470b54.png)
赤く囲ったようにUnwind segueが追加されています。
![スクリーンショット 2020-12-26 16.26.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755375/0b1b8944-6fe0-5ba4-783a-48c815a76a78.png)

#動かしてみた

![ダウンロード (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755375/0b0c0c05-9e59-243b-8920-997b8d5cf23b.gif)

#戻る前に値を渡してから遷移する場合
上で作成したものにtextFieldを追加して、画面遷移時に青い画面のlabelに値を渡してみます。
![スクリーンショット 2020-12-26 17.36.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755375/b683d75c-2acb-e37c-c06d-57d73381f088.png)

####緑の画面のコード
ボタンを押した時に、textFieldのtextが変数contentに代入され、Unwindで画面遷移して値を渡します。
今回は値を入れる処理をしてからの画面遷移になりますので、ボタンからの接続ではありません。
以下の画像の赤枠ThirdViewControllerからExitに接続します。
![スクリーンショット 2020-12-27 11.18.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755375/474bd16f-2957-29f0-ddf9-cd1914e648d4.png)
そしてUnwind segueにIdentifierを設定します。
そうする事で、Identifierを指定したタイミングでのみUnwind segueで戻る事ができます。
![スクリーンショット 2020-12-27 11.23.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755375/3a11c4db-72cc-bc30-582c-0ab304836927.png)


#####コード
ボタンが押されたら代入され、`performSegue`で先程設定したIdentifierの画面遷移を行います。

```swift
class ThirdViewController: UIViewController {
    @IBOutlet var textField: UITextField!
    var content = ""

@IBAction func segueButton(_ sender: Any) {
        content = textField.text!
        performSegue(withIdentifier: "segue", sender: sender)
    }
```
####青い画面のコード
Unwid segueの中にコードを書いていきます。
内容は以下の通りです。

+ 緑の画面ThirdViewControllerにアクセスできるように設定
+ 緑の画面ThirdViewControllerのcontentを青い画面のlabelに入れる 

#####コード
Unwid segueでbluesegueに戻ってきます。
その中にThirdViewControllerにアクセスするための定数を用意します。
ThirdViewControllerから戻ってくるので、ThirdViewControllerはsourceになるそうです。
segue.sourceはこの段階では UIViewController型になりますので、ThirdViewController型に変換してあげる必要があります。
as? ThirdViewController で変換しましょう。

```swift
class ViewController: UIViewController {

    @IBOutlet var label: UILabel!
   
    @IBAction func bluesegue(segue: UIStoryboardSegue) {

        let thirdView = segue.source as? ThirdViewController  //これでThirdViewControllerにアクセスできます。
        label.text = thirdView?.content  //contentをlabelのtextに入れます。
    }
}
```
#動かしてみた
![ダウンロード (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755375/42c10634-3a6f-b46c-6bbc-fa38b2297c03.gif)