38331


swift、Xcode9.0でクイズアプリを作っています。  
アプリ作りは初めてでプログラミング言語自体入門者です。

シミュレータでうまくアプリが動きません。  
コンパイルは成功するのですが、シミュレータにLaunch画面以外表示されず、  
viewControllerの以下の数カ所にエラーコードが出てしまいます。

  * 以下の部分は赤く染まり、`Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)`と表示
[code]     func Hide(){

        LabelEnd.isHidden = true
        Next.isHidden = true 
    
[/code]

  * 以下の部分も上記と同じく`BAD_INSTRUCTION`と表示
[code]     override func viewDidLoad() {

        super.viewDidLoad()
        Hide()
        RandomQuestions()
    
[/code]

デバッグエリアに `fatal error: unexpectedly found nil while unwrapping an Optional
value` と表示されているので、  
コードにあるoutlet接続とaction接続をstoryboardと再接続をしましたが、  
問題は解決されません。

どこに問題があるのか教えていただけないでしょうか。  
どうかご教授お願いします。  
独力ではお手上げ状態です。  
アプリ作りを始めて10日目。  
もう挫折しそう、、、。

[code]

    import UIKit
    
    class ViewController: UIViewController {
    
        @IBOutlet weak var Start: UIButton!
        @IBOutlet weak var QuestionLabel: UILabel!
    
    
        @IBOutlet weak var Button1: UIButton!
        @IBOutlet weak var Button2: UIButton!
        @IBOutlet weak var Button3: UIButton!
        @IBOutlet weak var Button4: UIButton!
    
        @IBOutlet weak var LabelEnd: UILabel!
        @IBOutlet weak var Next: UIButton!
    
    
        var CorrectAnswer = String()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
    
            Hide()
            RandomQuestions()
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
        func RandomQuestions() {
            var RandomNumber = arc4random() % 4
            RandomNumber += 1
    
            switch(RandomNumber) {
            case 1:
                QuestionLabel.text = "植物の光合成が行われる細胞小器官はどこ？"
                Button1.setTitle("ゴルジ体", for: UIControlState.normal)
                Button2.setTitle("ミトコンドリア", for: UIControlState.normal)
                Button3.setTitle("葉緑体", for: UIControlState.normal)
                Button4.setTitle("小胞体", for: UIControlState.normal)
                CorrectAnswer = "3"
    
                break
            case 2:
                QuestionLabel.text = "甲状腺から分泌されるホルモンは何？"
                Button1.setTitle("チロキシン", for: UIControlState.normal)
                Button2.setTitle("バソプレシン", for: UIControlState.normal)
                Button3.setTitle("鉱質コルチコイド", for: UIControlState.normal)
                Button4.setTitle("エストロゲン", for: UIControlState.normal)
                CorrectAnswer = "1"
    
                break
            case 3:
                QuestionLabel.text = "体細胞分裂で染色体が縦裂面で分離し、両極に移動するのはいつ？"
                Button1.setTitle("前期", for: UIControlState.normal)
                Button2.setTitle("中期", for: UIControlState.normal)
                Button3.setTitle("後期", for: UIControlState.normal)
                Button4.setTitle("終期", for: UIControlState.normal)
                CorrectAnswer = "3"
    
                break
            case 4:
                QuestionLabel.text = "動物の細胞説を提唱したのは誰？"
                Button1.setTitle("シュワン", for: UIControlState.normal)
                Button2.setTitle("フック", for: UIControlState.normal)
                Button3.setTitle("ブラウン", for: UIControlState.normal)
                Button4.setTitle("シュライデン", for: UIControlState.normal)
                CorrectAnswer = "1"
                break
    
    
            default:
    
                break
            }
        }
    
        func Hide(){
            LabelEnd.isHidden = true
            Next.isHidden = true
        }
        func UnHide(){
            LabelEnd.isHidden = false
            Next.isHidden = false
        }
    
    
    
    
    
        @IBAction func Button1Action(_ sender: Any) {
        UnHide()
            if (CorrectAnswer == "1") {
                LabelEnd.text = "合格！"
            }else{
                LabelEnd.text = "違うよ"
            }
        }
    
        @IBAction func Button2Action(_ sender: Any) {
        UnHide()
            if (CorrectAnswer == "2") {
                LabelEnd.text = "合格！"
            }else{
                LabelEnd.text = "違うよ"
            }
        }
    
        @IBAction func Button3Action(_ sender: Any) {
        UnHide()
            if (CorrectAnswer == "3") {
                LabelEnd.text = "合格！"
            }else{
                LabelEnd.text = "違うよ"
            }
        }
    
        @IBAction func Button4Action(_ sender: Any) {
        UnHide()
            if (CorrectAnswer == "4") {
                LabelEnd.text = "合格！"
            }else{
                LabelEnd.text = "違うよ"
            }
        }
    
    
        @IBAction func Next(_ sender: Any) {
        RandomQuestions()
            Hide()
    
        }
    
    }
    
[/code]


CC BY-SA 3.0
2017-09-30T15:02:29.757
38327
2017-10-01T00:51:25.457
2017-09-30T22:10:24.453
19110
25610
question
swift xcode swift3
swiftでのアプリ制作でエラー内容がわからない


> デバッグエリアに fatal error: unexpectedly found nil while unwrapping an Optional
> value と表示されているので、

ゆえに

> コードにあるoutlet接続とaction接続をstoryboardと再接続をしましたが、

というのは、意味がよくわかりません。

> unexpectedly found nil while unwrapping an Optional value

は、意訳すると、 **Optional型の変数を、Unwrap（非Optional型の変数に変換）しようとしたら、変数の値がnilだった**
となり、非Optional型の変数にnilを代入しようとして、致命的なエラー（fatal
error）が発生したケースを意味しています。直接Storyboardと関係するエラーではなく、はるかに抽象的なエラーメッセージです。このメッセージから、Storyboardの編集にエラーの原因があると判断するのは、あまり妥当性がありません。

とはいえ、Storyboard上のView（ボタン、ラベルなど）と、コード上のIBAction、IBOutletの接続に問題がある（エラーの原因がある）と判定するのは、おそらく正しいでしょう。その理由は、ご提示の`ViewController`クラスのコードを、新規作成したプロジェクトにコピー＆ペーストし、適宜Storyboardと接続を行なって、Runさせると、（おそらく）意図どおりのシミュレータの動きを示したからです。コードに問題がなければ、次に疑うべきは、Storyboardの編集です。

> コードにあるoutlet接続とaction接続をstoryboardと再接続をしましたが、問題は解決されません。

この **再接続** の手順に問題があると、私は疑っています。  
Storyboard上の1個のコントロール（ボタンなど）から、コード上の複数のIBActionメソッドに接続できることを、ご存知ですか？わかりやすく言い換えると、ひとつのボタンを一回タップして、複数のアクションメソッドを同時に実行できるのです。

[![画像の説明をここに入力](https://i.stack.imgur.com/0WJLg.png)](https://i.stack.imgur.com/0WJLg.png)

Storyboard上のボタンを選択し、Connection
Inspectorを見ると、上図のように、ふたつのIBActionを接続できることが確認できます。  
**再接続**
の手順が、単に新しく接続を行なっただけなら、「再接続」前の接続は、そのまま残ったままです。古い接続がキャンセルされ、新しい接続と置き換わるということにはなりません。  
そして、Xcodeのふるまいで困ったことに、コード上から、IBAction、IBOutletの対象のメソッド、プロパティを削除しても、Storyboard上の接続は自動削除されず、幽霊として残ってしまいます。上図のConnection
Inspectorで、幽霊接続がないかいちいち確認し、あれば削除しなければいけません。

> 独力ではお手上げ状態です。

ぜんぜん、お手上げにはなってませんよ。  
質問投稿サイトで見られる質問の多くに共通していることがあります。質問者のほとんどが、科学的考察を苦手としている（科学的考察をしていない）点です。  
問題としている現象を分析し、推論し、仮説を立てる。仮説が正しいか検証する方法（実験）を考案し、じっさいに検証する。検証から仮説が正しいと判断できれば、次の段階に進む。そうでなければ、分析、推論、仮説を立てるステップに戻り、考察を続ける。  
Xcodeによるプログラムの開発においては、検証を行うために、新規プロジェクト作成を、その都度行うことになるでしょう。幸いにも、Xcodeには、Playgroundというツールがあるので、かなり新規プロジェクト作成の頻度を下げることができます。が、それにしてもたとえば、学習のために10個のチュートリアルに取り組むとしたら、おそらく100個程度の新規プロジェクトは、作ることになるでしょう。  
ご提示になったソースコードは、質問者さんが実際に問題を起こしているコードとは、同一ではありませんね？一部抜粋したものを提示なさっているのだと、ボタン`Start`に該当するアクションメソッドがないことから、推理できます。質問者さんご自身が、新規プロジェクトを作成し、このご提示のコードをコピー＆ペーストして動かしてみましょう。そして、元のプロジェクトとの違いを調べてみることです。


CC BY-SA 3.0
2017-10-01T00:51:25.457
38331
2017-10-01T00:51:25.457
18540
38327
answer