画面を開くと下記の部分でこのエラーが発生します。
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
questionDataにアクセスする前にデータ入れてあげれば?
中身がないっていってるんだから、中身を入れてあげないことには先に進まないかと…
この!はアクセスする前に中身を入れることを約束した場合につけていい!なので、約束はまもってあげてください。
どうゆうことでしょうか?
提示されたコードは「本気ではじめるiPhoneアプリ作り(西麿翁・著)」の第6章「クイズアプリのプログラムの実装」で使われているコードでしょうか。
参考にされているのであれば、参考文献として書籍名は載せた方がいいです(書籍が間違っている可能性もあるからです)。
そうであれば、StartViewController.swiftの「//問題文のセット」と書かれている後の行で、questionDataに値をセットしている処理があるので、そこを間違っていなければきちんと動くはずですが、間違いはありませんでしょうか。
その書籍であっています。
確認しましたが、間違いはありませんでした。どの部分も書籍と同じであります。
3つあるコードを見てみないと何とも言えないので、できれば質問を編集して全て載せてもらえないでしょうか。
編集しました。よろしくお願いします。
編集<-コメントをここから回答欄に移しました。編集してくださいという催促ではありません。
編集していますよ。