前提・実現したいこと
swiftで簡単なプログラムを作っています。
画面2のpickerで値を選択して、その値を画面1の変数targetAgeに代入したいのですが、pickerの値の型はStringなのに対して変数の値はIntなので迷っています。
そこで画面2のpickerで選択した値を文字として、画面1のラベル(値が送られる)に書き出すことには成功したのですが、そのラベルにテキストされた値を変数に代入しようとするとできません。
簡単にまとめると
文字を変数に置き換えるにはこの場合どうすればよいのかをお尋ねしたいです。
発生している問題・エラーメッセージ
Cannot assign value of type 'String' to type 'String?'```
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
この二つが出ました
### 該当のソースコード 画面1 (左側) class ViewController: UIViewController { var age:Int = 1 var targetAge:Int = 100 var changeTheTarget:Int? override func viewDidLoad() { super.viewDidLoad() redraw() if catchTheData.text = "100"{ targetAge = 100 }else if catchTheData.text = "200"{ targetAge = 200 }else if catchTheData.text = "300"{ targetAge = 300 } ↑ここで上の二つのエラーが出た } func redraw() { ageTextField.text = String(age) + "億円" if targetAge - age == targetAge { messageLabel.text = "残念、破産!!" }else if age > targetAge { messageLabel.text = String(age-targetAge) + "億円オーバー" }else if age < targetAge { messageLabel.text = String(targetAge-age) + "億円足りてない" }else { messageLabel.text = "やったーー!!" } } @IBOutlet weak var ageTextField:UITextField! @IBAction func double(_ sender: UIButton) { //2倍// age = age * 2 redraw() } @IBAction func Triple(_ sender: UIButton) { //3倍// age = age * 3 redraw() } @IBAction func OneFifth(_ sender: UIButton) { //5で割る// age = age / 5 redraw() } @IBAction func clear(_ sender: UIButton) { //リセット// age = 1 redraw() } @IBOutlet weak var messageLabel: UILabel! //textfieldの上のラベル// @IBOutlet weak var catchTheData: UILabel! //値が送られる// } 画面2 (右側) class ViewController2ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource { @IBOutlet var label: UILabel! @IBOutlet var pickerView: UIPickerView! let dataList = [ "100億円","200億円","300億円" ] override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view pickerView.delegate = self pickerView.dataSource = self label.text = "目標金額を設定" pickerView.backgroundColor = #colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1) } // UIPickerViewの列の数 func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } // UIPickerViewの行数、リストの数 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return dataList.count } // UIPickerViewの最初の表示 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return dataList[row] } // UIPickerViewのRowが選択された時の挙動 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int){ label.text = dataList[row] } @IBAction func buttontapped(_ sender: Any) { performSegue(withIdentifier: "toViewController",sender: nil) } // Segue 準備 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if (segue.identifier == "toViewController") { let vc2: ViewController = (segue.destination as? ViewController)! if label.text == "100億円"{ vc2.changeTheTarget = 100 }else if label.text == "150億円"{ vc2.changeTheTarget = 150 }else if label.text == "200億円"{ vc2.changeTheTarget = 200 } } } } ```ここに言語名を入力 swift ### 試したこと 変数changethetargetの型をIntに変更して、 画面1の方に targetAge = changethetarget と書いて試してみましたが、ダメでした ### 補足情報(FW/ツールのバージョンなど) コードが長いですが、 よろしくお願いします
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。