質問編集履歴

2 該当箇所を明示するため

A2wwM

A2wwM score 12

2017/01/26 01:16  投稿

【swift3】アプリが落ちる【アンラップ】
乱数を使ったクイズアプリを作っています。
textFieldに0~100までの数字を入力してボタンをタップ。
2回以内にその数字が乱数と一致した場合はUILabelに”正解”、乱数よりも小さければ”それよりは大きい”、乱数よりも大きければ”それよりは小さい”と表示。3回目以降に関しては、textFieldに入力した数字が一致した場合はUILabelに"正解"、一致しなければ”不正解”と表示されるような内容になっています。
###発生している問題・エラーメッセージ
```
アプリ(シュミレーター)を起動させ、textFieldに何も値がない状態でボタンをクリックすると
アンラップができていないせいかアプリが落ちデバッグエリアに
「fatal error: unexpectedly found nil while unwrapping an Optional value」と表示されます。
さらに該当コードの横にエラーマークと一緒に「Value of optional type "String?" not unwrapped: did you mean to use "!" or "?"」表示され、「Replace Int(textField?.text)! with Int((textField?.text)!)!」と変更することを促されます。
*以下写真より該当箇所参照  
![イメージ説明](b8fe402f1831d1675014ee394c90e234.png)
*なぜか写真が添付できないので、該当箇所はコードにコメントアウトして記載しておきます
一応この指示に従い変更してみたのですが、最初と同じように、アプリ(シュミレーター)を起動後、ボタンをクリックするとやはりアプリが落ち、同じように「fatal error: unexpectedly found nil while unwrapping an Optional value」と表示されます。
```
###【聞きたいこと】
```
textFieldに何も値がない状態でボタンをクリックしてもアプリ落ちないようにしたいのですが
この場合どうすればよろしいのでしょうか?
```
###ソースコードを入力
```
//
// ViewController.swift
// Test
//
// Created by on 2017/01/25.
// Copyright © 2017年 All rights reserved.
//
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
 //ボタンを押した回数
 var number : Int = 0
 //クイズの答えを乱数で設定(0~100)
 var random: UInt32 = arc4random_uniform(101)
 
 //UILabelにコメントが表示される
 @IBOutlet weak var result: UILabel!
 
 //TextFieldに答えを入力する
 @IBOutlet weak var textField: UITextField?
 
 override func viewDidLoad() {
   super.viewDidLoad()
   // Do any additional setup after loading the view, typically from a nib.
   
   
   //placeholder
   textField?.placeholder = "数字を入力してね"
   
   textField?.delegate = self
 }
 override func didReceiveMemoryWarning() {
   super.didReceiveMemoryWarning()
   // Dispose of any resources that can be recreated.
 }
  //tableviewのdelegateメソッド
 func textFieldShouldReturn(_ textField: UITextField) -> Bool {
   //キーボードを閉じる
   textField.resignFirstResponder()
   
   //trueを返す
   return true
 }
 
//
 @IBAction func check(_ sender: Any) {
   number += 1
 
     
     
   if number < 3 {
     
       
   
   if Int((textField?.text)!) == Int(random) {
   
   if Int((textField?.text)!) == Int(random) {    //←該当箇所
     
     result.text = "正解!"
   } else if Int(textField?.text)! > Int(random) {
   } else if Int(textField?.text)! > Int(random) { //←該当箇所
     result.text = "それよりは小さい"
   } else if Int(textField?.text)! < Int(random) {
   } else if Int(textField?.text)! < Int(random) { //←該当箇所
     result.text = "それよりは大きい"
   }
   
   }
   
   
   
     if number >= 3 {
 
 
       if Int(textField?.text)! == Int(random) {
       if Int(textField?.text)! == Int(random) { //←該当箇所
         result.text = "正解!"
       } else {
         result.text = "不正解"
       }
 
     }
   }
}
```
###補足情報(言語/FW/ツール等のバージョンなど)
swift3.0
xcode8.2.1
macOS Sierra(バージョン 10.12)
  • Swift

    13987 questions

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

1 個人情報を消した

A2wwM

A2wwM score 12

2017/01/26 00:50  投稿

【swift3】アプリが落ちる【アンラップ】
乱数を使ったクイズアプリを作っています。
textFieldに0~100までの数字を入力してボタンをタップ。
2回以内にその数字が乱数と一致した場合はUILabelに”正解”、乱数よりも小さければ”それよりは大きい”、乱数よりも大きければ”それよりは小さい”と表示。3回目以降に関しては、textFieldに入力した数字が一致した場合はUILabelに"正解"、一致しなければ”不正解”と表示されるような内容になっています。
###発生している問題・エラーメッセージ
```
アプリ(シュミレーター)を起動させ、textFieldに何も値がない状態でボタンをクリックすると
アンラップができていないせいかアプリが落ちデバッグエリアに
「fatal error: unexpectedly found nil while unwrapping an Optional value」と表示されます。
さらに該当コードの横にエラーマークと一緒に「Value of optional type "String?" not unwrapped: did you mean to use "!" or "?"」表示され、「Replace Int(textField?.text)! with Int((textField?.text)!)!」と変更することを促されます。
*以下写真より該当箇所参照
![イメージ説明](b8fe402f1831d1675014ee394c90e234.png)
一応この指示に従い変更してみたのですが、最初と同じように、アプリ(シュミレーター)を起動後、ボタンをクリックするとやはりアプリが落ち、同じように「fatal error: unexpectedly found nil while unwrapping an Optional value」と表示されます。
```
###【聞きたいこと】
```
textFieldに何も値がない状態でボタンをクリックしてもアプリ落ちないようにしたいのですが
この場合どうすればよろしいのでしょうか?
```
###ソースコードを入力
```
//
// ViewController.swift
// Test
//
// Created by 山田諭 on 2017/01/25.
// Copyright © 2017年 BbA. All rights reserved.
// Created by on 2017/01/25.
// Copyright © 2017年 All rights reserved.
//
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
 //ボタンを押した回数
 var number : Int = 0
 //クイズの答えを乱数で設定(0~100)
 var random: UInt32 = arc4random_uniform(101)
 
 //UILabelにコメントが表示される
 @IBOutlet weak var result: UILabel!
 
 //TextFieldに答えを入力する
 @IBOutlet weak var textField: UITextField?
 
 override func viewDidLoad() {
   super.viewDidLoad()
   // Do any additional setup after loading the view, typically from a nib.
   
   
   //placeholder
   textField?.placeholder = "数字を入力してね"
   
   textField?.delegate = self
 }
 override func didReceiveMemoryWarning() {
   super.didReceiveMemoryWarning()
   // Dispose of any resources that can be recreated.
 }
  //tableviewのdelegateメソッド
 func textFieldShouldReturn(_ textField: UITextField) -> Bool {
   //キーボードを閉じる
   textField.resignFirstResponder()
   
   //trueを返す
   return true
 }
 
//
 @IBAction func check(_ sender: Any) {
   number += 1
 
     
     
   if number < 3 {
     
     
   
   if Int((textField?.text)!) == Int(random) {
     
     result.text = "正解!"
   } else if Int(textField?.text)! > Int(random) {
     result.text = "それよりは小さい"
   } else if Int(textField?.text)! < Int(random) {
     result.text = "それよりは大きい"
   }
   
   }
   
   
   
     if number >= 3 {
 
 
       if Int(textField?.text)! == Int(random) {
         result.text = "正解!"
       } else {
         result.text = "不正解"
       }
     }
   }
}
```
###補足情報(言語/FW/ツール等のバージョンなど)
swift3.0
xcode8.2.1
macOS Sierra(バージョン 10.12)
  • Swift

    13987 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る