質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

913閲覧

画面遷移と型の違いについて <初歩的>

shimono

総合スコア13

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/02/21 12:50

前提・実現したいこと

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/ツールのバージョンなど) コードが長いですが、 よろしくお願いします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

色々ありました。ステップバイステップ見ましょう。

こちらは===のバグ

swift

1if catchTheData.text = "100"{ 2targetAge = 100 3}else if catchTheData.text = "200"{ 4targetAge = 200 5}else if catchTheData.text = "300"{ 6targetAge = 300 7}

正しいは:

swift

1if catchTheData.text == "100"{ 2targetAge = 100 3}else if catchTheData.text == "200"{ 4targetAge = 200 5}else if catchTheData.text == "300"{ 6targetAge = 300 7}

ただし、このコード自体は必要ありません。直接に、intを渡せるので。

まず、PickerViewのコントローラーで表示用のデーターと値のデーターを分けましょう:

swift

1 let visibleList = ["100B","150B","200B"] 2 let valueList = [100,150,200]

そして、performSegueで渡しましょう。
テキストとの比較をやらない方がいいです。行の番号を使ったのが適切ですね。
let selectedRow = pickerView.selectedRow(inComponent: 0)
値を値の配列から選択した行の番号で取れます:vc.targetAge = valueList[selectedRow]

swift

1 @IBAction func buttontapped(_ sender: Any) { 2 performSegue(withIdentifier: "toViewController",sender: nil) 3 } 4 5 // Segue 準備 6 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 7 if (segue.identifier == "toViewController") { 8 let vc: ViewController = (segue.destination as? ViewController)! 9 let selectedRow = pickerView.selectedRow(inComponent: 0) 10 11 vc.targetAge = valueList[selectedRow] 12 } 13 }

PickerViewのデモプロジェクトをご覧ください:
https://github.com/vanderlvoff/pickerViewDemo

投稿2019/02/21 16:13

vanderlvov

総合スコア685

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問