40431
初心者です。  
画像の様に、tableviewの選択したセルを遷移先の画面ラベルに表示する機能を実装したいのですが、  
アプリをビルドしセルを選択すると、tableviewcontrollerのprepareメソッドで  
Fatal error: Unexpectedly found nil while unwrapping an Optional value  
とエラーメッセージが表示されます。  
この文を調べ、数時間コードと格闘したのですが結局よくわかりませんでした。。

自分では原因はtableviewcontrollerのprepareメソッド、viewcontrollerの、var
data:Stringの記述だと思っています。

正しいコードに直すとしたらどこをどう直すのか、ご教授願いたいです。  
よろしくお願いします。

[![画像の説明をここに入力](https://i.stack.imgur.com/1FmyF.png)](https://i.stack.imgur.com/1FmyF.png)  
[![画像の説明をここに入力](https://i.stack.imgur.com/Y7pR4.png)](https://i.stack.imgur.com/Y7pR4.png)  
[![画像の説明をここに入力](https://i.stack.imgur.com/8SDyd.png)](https://i.stack.imgur.com/8SDyd.png)
CC BY-SA 3.0
2017-12-20T15:44:06.940
40429
2017-12-20T17:33:07.360
26683
question
swift xcode
tableviewの選択したセルを遷移先画面に表示する
### 修正.1

`prepare()` 関数のタイミングではまだ次の画面のラベルは生成されていません。ラベルにテキストをセットしようとすると `nil`
の入ったオプショナル型の `label` を強制的にアンラップしようとしてエラーになります。ここでは `viewContoller.data`
に文字列をセットするのが正しいです。また、遷移先のビューコントローラもこの先必ずしも `ViewController`
型とは限らないので、オプショナルバインディング（`if let` 文）が望ましいです。

```

    // TableViewController.swift
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let indexPath = self.tableView.indexPathForSelectedRow {
            let data = self.dataList[indexPath.row]
            if let viewController = segue.destination as? ViewController {
                // viewController.label.text = data
                viewController.data = data
            }
        }
    }
    
```

### 修正.2

現在の動作ではエラーになりませんが、`ViewController` のプロパティ `var data: String!`
に値が入る保証がないので、なるべくなら `String?` にすべきです。`viewDidLoad()`
関数内ではオプショナルバインディングで値の存在を確認した上でラベルへ反映します。

```

    import UIKit
    
    class ViewController: UIViewController {
        // var data: String!
        var data: String?
        @IBOutlet weak var label: UILabel!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            if let data = self.data {
                self.label.text = data
            }
        }
    }
    
```
CC BY-SA 3.0
2017-12-20T17:33:07.360
40431
2017-12-20T17:33:07.360
40429
answer