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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

2回答

1411閲覧

swift 致命的なエラー:オプション値を暗黙的にアンラップしているときに予期せずnilが見つかりました

Kumt

総合スコア4

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

1クリップ

投稿2020/04/07 13:13

編集2020/04/08 10:35

画面を開くと下記の部分でこのエラーが発生します。
QuestionLabel.text = "Q. (questionData.questionNo)"

StartViewController

1class StartViewController: UIViewController { 2 3 override func viewDidLoad(){ 4 super.viewDidLoad() 5 } 6 7 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 8// 問題文の読み込み 9 QuestionDataManager.sharedInstance.loadQuestion() 10// 変位先画面の呼び出し 11 guard let nextViewController = segue.destination as? 12 QuestionViewController else { 13 return 14 } 15 guard let questionData = QuestionDataManager.sharedInstance.nextQuestion() else { 16 return 17 } 18 nextViewController.questionData = questionData 19 } 20 @IBAction func goToTitle(_ segue: UIStoryboardSegue) { 21 22 } 23} 24

QuestionDataManager

1import Foundation 2 3class QuestionData { 4 5 var question: String 6 var answer1: String 7 var answer2: String 8 var answer3: String 9 var answer4: String 10 var correctAnswerNumber: Int 11 var userChoiceAnswerNumber: Int? 12 var questionNo: Int = 0 13 14 init(questionSourceDataArray: [String]) { 15 question = questionSourceDataArray[0] 16 answer1 = questionSourceDataArray[1] 17 answer2 = questionSourceDataArray[2] 18 answer3 = questionSourceDataArray[3] 19 answer4 = questionSourceDataArray[4] 20 correctAnswerNumber = Int(questionSourceDataArray[5])! 21 } 22 func isCorrect() -> Bool { 23 if correctAnswerNumber == userChoiceAnswerNumber { 24 return true 25 } 26 return false 27 } 28} 29 30 31 32 33class QuestionDataManager { 34 static let sharedInstance = QuestionDataManager() 35 var questionDataArray = [QuestionData]() 36 var nowQuestionIndex: Int = 0 37 private init() { 38 39 } 40 func loadQuestion() { 41 questionDataArray.removeAll() 42 nowQuestionIndex = 0 43 44 guard let csvFilePath = Bundle.main.path(forResource: "question", ofType: "csv") else { 45 print("csvファイルが存在しません") 46 return 47 } 48 49// csvファイル読み込み 50 do { 51 let csvStringData = try String(contentsOfFile: csvFilePath,encoding: String.Encoding.utf8) 52// csvファイルを1行ずつ読み込む 53 csvStringData.enumerateLines(invoking: { (line, stop) in 54//カンマ区切りで分割 55 let questionSourceDataArray = line.components(separatedBy: ",") 56//問題データを格納するオブジェクトを作成 57 58 let questionData = QuestionData(questionSourceDataArray: questionSourceDataArray) 59 60// 問題を追加 61 self.questionDataArray.append(questionData) 62// 問題番号を設定 63 questionData.questionNo = self.questionDataArray.count 64 } 65 ) 66 } catch let error { 67 print("csvファイル読み込みエラーが発生しました:(error)") 68 return 69 } 70} 71 72 73//次の問題を取り出す 74func nextQuestion() -> QuestionData? { 75 if nowQuestionIndex < questionDataArray.count { 76 let nextQuestion = questionDataArray[nowQuestionIndex] 77 nowQuestionIndex += 1 78 return nextQuestion 79 } 80 return nil 81} 82} 83 84

QuestionViewController

1import UIKit 2import AudioToolbox 3 4class QuestionViewController: UIViewController { 5 var questionData: QuestionData! 6 7 8 @IBOutlet weak var QuestionLabel: UILabel! 9 10 @IBOutlet weak var questionTextView: UITextView! 11 12 @IBOutlet weak var Quiz1Botton: UIButton! 13 @IBOutlet weak var Quiz2Botton: UIButton! 14 @IBOutlet weak var Quiz3Botton: UIButton! 15 @IBOutlet weak var Quiz4Botton: UIButton! 16 17 @IBOutlet weak var correctImageView: UIImageView! 18 19 @IBOutlet weak var inCorrectImageView: UIImageView! 20 21override func viewDidLoad() { 22 super.viewDidLoad() 23 QuestionLabel.text = "Q. (questionData.questionNo)" 24 questionTextView.text = questionData.question 25 Quiz1Botton.setTitle(questionData.answer1,for: UIControl.State.normal) 26 Quiz2Botton.setTitle(questionData.answer2,for: UIControl.State.normal) 27 Quiz3Botton.setTitle(questionData.answer3,for: UIControl.State.normal) 28 Quiz4Botton.setTitle(questionData.answer4,for: UIControl.State.normal) 29 30} 31 32 @IBAction func tap1Botton(_ sender: Any) { questionData.userChoiceAnswerNumber = 1 33 goNextQuestionWithAnimation() 34 } 35 36 @IBAction func tap2Botton(_ sender: Any) { questionData.userChoiceAnswerNumber = 2 37 goNextQuestionWithAnimation() 38 } 39 40 @IBAction func tap3Botton(_ sender: Any) { 41 questionData.userChoiceAnswerNumber = 3 42 goNextQuestionWithAnimation() 43 } 44 45 @IBAction func tap4Botton(_ sender: Any) { 46 questionData.userChoiceAnswerNumber = 4 47 goNextQuestionWithAnimation() 48 } 49 50 func goNextQuestionWithAnimation() { 51// 正解しているか判定する 52 if questionData.isCorrect() { 53// 正解のアニメーションを再生しながら次の問題へ 54 goNextQuestionWithCorrectAnimation() 55 } else { 56 goNextQuestionWithIncorrectAnimation() 57 } 58 } 59// 次の問題に正解のアニメーション付きで遷移する 60 func goNextQuestionWithCorrectAnimation() { 61// 正解を伝える音を鳴らす 62 AudioServicesPlayAlertSound(1025) 63// アニメーション 64 UIView.animate(withDuration: 2.0, animations: { 65 self.correctImageView.alpha = 1.0 66 }) { (Bool) in 67 self.goNextQuestion() 68 } 69 } 70// 不正解のアニメーション付きで遷移する 71 func goNextQuestionWithIncorrectAnimation() { 72// 不正解を伝える音を鳴らす 73 AudioServicesPlayAlertSound(1006) 74 UIView.animate(withDuration: 2.0, animations: { 75 self.inCorrectImageView.alpha = 1.0 76 }) { (Bool) in 77 self.goNextQuestion() 78 } 79} 80 func goNextQuestion() { 81 guard let nextQuestion = QuestionDataManager.sharedInstance.nextQuestion() else { 82 if let resultViewController = storyboard?.instantiateViewController(withIdentifier: "result") as? ResultViewController { 83 present(resultViewController, animated: true, completion: nil) 84 } 85 return 86 } 87 88 if let nextQuestionViewController = storyboard?.instantiateViewController(withIdentifier: "question") as? 89 QuestionViewController { 90 nextQuestionViewController.questionData = nextQuestion 91 present(nextQuestionViewController, animated: true, 92 completion: nil) 93 } 94 } 95} 96

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/04/07 13:23 編集

questionDataにアクセスする前にデータ入れてあげれば? 中身がないっていってるんだから、中身を入れてあげないことには先に進まないかと… この!はアクセスする前に中身を入れることを約束した場合につけていい!なので、約束はまもってあげてください。
Kumt

2020/04/07 13:20

どうゆうことでしょうか?
TsukubaDepot

2020/04/07 13:44

提示されたコードは「本気ではじめるiPhoneアプリ作り(西麿翁・著)」の第6章「クイズアプリのプログラムの実装」で使われているコードでしょうか。 参考にされているのであれば、参考文献として書籍名は載せた方がいいです(書籍が間違っている可能性もあるからです)。 そうであれば、StartViewController.swiftの「//問題文のセット」と書かれている後の行で、questionDataに値をセットしている処理があるので、そこを間違っていなければきちんと動くはずですが、間違いはありませんでしょうか。
Kumt

2020/04/08 10:09

その書籍であっています。 確認しましたが、間違いはありませんでした。どの部分も書籍と同じであります。
TsukubaDepot

2020/04/08 10:28

3つあるコードを見てみないと何とも言えないので、できれば質問を編集して全て載せてもらえないでしょうか。
Kumt

2020/04/08 10:35

編集しました。よろしくお願いします。
退会済みユーザー

退会済みユーザー

2020/04/08 12:37 編集

編集<-コメントをここから回答欄に移しました。編集してくださいという催促ではありません。
Kumt

2020/04/08 12:23

編集していますよ。
guest

回答2

0

提示されたコードと、出版社が公開しているサンプルソース内のStoryboardの設定を組み合わせて動作確認してみました。

結果ですが、コードは間違っていません。きちんと最後まで動作します。

出たエラーが

Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value:

ということであれば、考えられる(こちらで再現できた)エラーは、Referencing Outlet の設定が間違っているということです。

swift

1@IBOutlet weak var QuestionLabel: UILabel!

の左側が

イメージ説明

このように黒丸になっていませんでしょうか。
このようになっている場合は、Referenceing Outlet の接続が切れています。
黒丸のところでドラッグして(クリックしたままマウスを動かして)、接続したいUI部品と再接続してみてください。

イメージ説明

このように白丸の場合でも、正しい部品と接続してあるか確認してみてください。
基本的に違う部品とは接続できないようになっていますが、Constraintとは接続できることがあります。

#追記
Interface Bulder の Custom Class -> Module に変な値が入っていませんか(例の書籍でやるぶんにはここをいじる必要はないはずです)?
正しく設定していないと、やはり同じような原因でエラーになることがあります。

イメージ説明

もし、Inherit Module Target のチェックが外れていて、なにか違う値がはいっているようであれば、再度チェックを入れ直してコンパイルし(おそらくMy Quizという名前になるはずです)、実行してみてください。

投稿2020/04/08 13:19

編集2020/04/09 11:36
TsukubaDepot

総合スコア5086

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

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

退会済みユーザー

退会済みユーザー

2020/04/08 13:34

ごくろうさま、エラーが出る行の前で、ラベルをプリントした結果を貼ってもらえばいいんじゃないかな? print(QuestionLabel) けど、print("Q. (questionData.questionNo)")でエラーがでるって言ってるよ。
TsukubaDepot

2020/04/08 13:36

ありがとうございます。 実は、リファレンスがうまくいってない場合は、このprint()のところで落ちるんですよね。
TsukubaDepot

2020/04/08 13:37

まぁ、私のところで試した限りなので、必ずしも質問者さんの場合はどうなのかはわかりませんが。 tyobigorouさんのコメントへの回答待ちですね。
退会済みユーザー

退会済みユーザー

2020/04/08 13:49

いや、たしか、リファレンスがうまくいってないときはnilとプリントされると認識してるんですが なんで、outlet接続がおぼつかないような人にはこれじゃないと、そこで何がおこってるか把握できない
TsukubaDepot

2020/04/08 14:07

なるほど。たしかに接続がうまくいってないときには print(QuestionLabel) はnilと表示されますね。
Kumt

2020/04/09 10:55

画像の説明の通り接続を確認しましたが、正しく接続されています。
TsukubaDepot

2020/04/09 10:58

ちなみに、tyobigorouさんがコメントされていますが、print()で表示された値はどのようになっているのでしょうか。
Kumt

2020/04/09 11:20

指示されたコードを入れますとコンソールにこのように出ます。 2020-04-09 20:19:19.452062 + 0900単一のクイズアプリ[15196:1173219] [ストーリーボード] Interface Builderファイルの不明なクラスStartViewController。 2020-04-09 20:19:20.129581 + 0900単一のクイズアプリ[15196:1173219] CoreText注:クライアントは名前「.PingFangSC-Regular」を要求しました。意図したフォントではなくTimesNewRomanPSMTを取得します。すべてのシステムUIフォントアクセスは、CTFontCreateUIFontForLanguage()または+ [UIFont systemFontOfSize:]などの適切なAPIを介して行われる必要があります。 2020-04-09 20:19:20.129762 + 0900シングルクイズアプリ[15196:1173219] CoreText注:CTFontLogSystemFontNameRequestにブレークポイントを設定してデバッグします。 2020-04-09 20:19:20.152163 + 0900単一のクイズアプリ[15196:1173219] [ストーリーボード] Interface Builderファイルの不明なクラスQuestionData。 致命的なエラー:省略可能な値を暗黙的にアンラップしているときに予期せずnilが見つかりました:ファイル/ Users / utsunomiyakaede / Downloads /編集/ my /テストプロジェクト/ Mycalc / Mycalc / Mycalc / single quiz App / single quiz App / QuestionViewContoroller.swift、line 32 2020-04-09 20:19:20.156717 + 0900シングルクイズアプリ[15196:1173219]致命的なエラー:オプション値を暗黙的にアンラップしているときに予期せずnilが見つかりました:file / Users / utsunomiyakaede / Downloads /編集/ my /テストプロジェクト/ Mycalc / Mycalc /シングルクイズアプリ/シングルクイズアプリ/QuestionViewContoroller.swift、32行目 (lldb
TsukubaDepot

2020/04/09 11:38

エラーメッセージは翻訳せず、そのまま転載してもらった方がいいです(むしろ解決の妨げになります)。 この一連のエラーと同じようなエラーが出てくる原因はわかりました。詳しくは回答本文の追記をみてみてください。
Kumt

2020/04/09 11:42

何も入っておらず、チェックも入っておりませんでしたので、チェックを入れてビルドするとエラーが起きました。 Thread 1: signal SIGABRT
TsukubaDepot

2020/04/09 11:53

うーん、私だと現状これ以上は追跡が難しいです。 正直なところ、ここで悩んで時間を消費するより、新しくプロジェクトを作り直して、Interface Builderに部品をならべ、ソースコードだけ再利用した方が時間も有効に使えると思いますが、いかがでしょうか。
guest

0

QuestionData変数に初期値がないのでエラーになっているということです。

投稿2020/04/07 21:44

freemann

総合スコア264

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

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

Kumt

2020/04/08 10:26

初期値はしっかり入っています。
退会済みユーザー

退会済みユーザー

2020/04/08 10:56

QuestionViewController/viewDidLoad()のsuper.viewDidLoad()の直下で print("Q. (questionData.questionNo)")ってしたらどうなるの?
Kumt

2020/04/08 12:24

ペーストして書きましたが、その部分で同じエラーが出ます。
退会済みユーザー

退会済みユーザー

2020/04/08 12:30

同じエラーとは? コンソールに表示されたエラーを教えて下さい。
Kumt

2020/04/09 10:53

コンソールに題名と同じエラーが表示されます。
退会済みユーザー

退会済みユーザー

2020/04/09 11:33

日本語でエラーはくの?
Kumt

2020/04/09 11:38

翻訳しただけですが。原文はこちらです。 2020-04-09 20:19:19.452062+0900 single quiz App[15196:1173219] [Storyboard] Unknown class StartViewController in Interface Builder file. 2020-04-09 20:19:20.129581+0900 single quiz App[15196:1173219] CoreText note: Client requested name ".PingFangSC-Regular", it will get TimesNewRomanPSMT rather than the intended font. All system UI font access should be through proper APIs such as CTFontCreateUIFontForLanguage() or +[UIFont systemFontOfSize:]. 2020-04-09 20:19:20.129762+0900 single quiz App[15196:1173219] CoreText note: Set a breakpoint on CTFontLogSystemFontNameRequest to debug. 2020-04-09 20:19:20.152163+0900 single quiz App[15196:1173219] [Storyboard] Unknown class QuestionData in Interface Builder file. Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value: file /Users/utsunomiyakaede/Downloads/編集/my/テストプロジェクト/Mycalc/Mycalc/single quiz App/single quiz App/QuestionViewContoroller.swift, line 32 2020-04-09 20:19:20.156717+0900 single quiz App[15196:1173219] Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value: file /Users/utsunomiyakaede/Downloads/編集/my/テストプロジェクト/Mycalc/Mycalc/single quiz App/single quiz App/QuestionViewContoroller.swift, line 32 (lldb)
退会済みユーザー

退会済みユーザー

2020/04/09 12:26

CSVからの読み込みを順番に追っていけばいいと思いますが、 「初期値はしっかり入っています。」ということでしたら何もやることはないですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問