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

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

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

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

Swift

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

Q&A

解決済

1回答

2562閲覧

Thread 1: Fatal error: Index out of rangeというエラーが発生して困っています。

Eiki121

総合スコア15

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/07/28 04:54

編集2019/07/31 09:43

簡単なマルバツのクイズアプリを作っています。
ビルドした後、スタートボタンを押すと下記のエラーメッセージが発生しました。
デバックエリアで確認すると変数に値が入っていないことが原因と考えられるのですが、何が原因で値が入らないのかが分かりません。

CSVファイル選択時の画面表示
(5f2600f5e423658e4f212b8f4b57dd0f.png)

発生している問題・エラーメッセージ

Thread 1: Fatal error: Index out of range

該当のソースコード

Swift

1import UIKit 2 3 4 5class QuizViewController: UIViewController { 6 7 //問題表示の接続 8 @IBOutlet weak var numberLabel: UILabel! 9 @IBOutlet weak var questionLabel: UILabel! 10 @IBOutlet weak var circle: UIButton! 11 @IBOutlet weak var cross: UIButton! 12 13 //正誤表示 14 @IBOutlet weak var answerImage: UIImageView! 15 16 //問題を格納 17 var csvArray = [String]() 18 19 // 取り出した問題を格納 20 var questionArray = [String]() 21 22 // 変数 23 var questionCount = 0 // 出題数 24 var correctCount = 0 // 正解 25 26 //定数 27 let total = 3 // 出題数 28 let waitQuestion = 0.8 //表示の間隔 29 30 //ゲーム表示完了後に開くメソッド 31 override func viewDidLoad() { 32 super.viewDidLoad() 33 34 // 問題の読み込み 35 csvArray = loadCSV(filename: "loveswift") 36 37 // 画面の初期化 38 answerImage.isHidden = true 39 40 // 問題表示 41 nextProblem() 42 43 } 44 45 46 47 @IBAction func btnAction(_ sender: UIButton) { 48 // 正解とボタンのタグ番号が同じなら正解 49 if sender.tag == Int(questionArray[1]) { 50 answerImage.image = UIImage(named: "correct.png") 51 correctCount += 1 52 } else { 53 answerImage.image = UIImage(named: "incorrect.png") 54 } 55 56 // 回答表示の有効化(0.8秒間) 57 answerImage.isHidden = false 58 DispatchQueue.main.asyncAfter(deadline: .now() + waitQuestion) { 59 self.answerImage.isHidden = true 60 } 61 62 // 次の問題文呼び出し 63 questionCount += 1 64 nextProblem() 65 66 } 67 68 69 70 71 72 // 問題表示 73 func nextProblem() { 74 // questionArrayの初期化 75 questionArray.removeAll(keepingCapacity: true) 76 if questionCount < total { 77 // questionArrayに新規問題を格納 78 questionArray = csvArray[questionCount].components(separatedBy: ",") 79 //ここにThread 1: Fatal error: Index out of rangeというエラーメッセージが表示されます。 80 81 // 表示内容をセット 82 numberLabel.text = "第(questionCount+1)問" 83 questionLabel.text = questionArray[0] 84 circle.setTitle(questionArray[2], for: .normal) 85 cross.setTitle(questionArray[3], for: .normal) 86 87 } else { 88 // Storyboard Segue の Identifier を引数に定義して画面遷移 89 DispatchQueue.main.asyncAfter(deadline: .now() + waitQuestion) { 90 self.performSegue(withIdentifier: "toResultViewController", sender: nil) 91 } 92 } 93 } 94 95 96 97 // Segue で値を渡す 98 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 99 let sVC: ResultViewController = (segue.destination as? ResultViewController)! 100 sVC.correct = correctCount 101 } 102 103 104 105 // CSVファイルの読み込み 106 func loadCSV(filename : String)->[String] { 107 // 返却値の初期化 108 var csvStr:[String] = [] 109 110 // CSVを読み込んでArrayに 111 if let csvPath = Bundle.main.path(forResource: filename, ofType: "csv") { 112 do { 113 var csvData = try String(contentsOfFile: csvPath, 114 encoding: String.Encoding.utf8) 115 csvData = csvData.replacingOccurrences(of: "\n", with: "") 116 csvStr = csvData.components(separatedBy: .newlines) 117 } catch let error as NSError { 118 print(error.localizedDescription) 119 } 120 } 121 return csvStr 122 } 123 124 125 126 127 128} 129

試したこと

CSVデータ確認やcsvArreyの初期化が上手く行えていないのかなと検索したり、コードをみて試行錯誤してましたが、なかなか上手く行かないので質問しました。よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

Xcode Version 10.2.1 (10E1001)

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

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

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

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

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

TakuyaAso

2019/07/28 05:37

return csvStr のところでブレークポイント止めてArrayの中身を見せてもらってもいいでしょうか? 3elementsちゃんとあるのか気になります。
Eiki121

2019/07/28 06:52

回答ありがとうございます。 ブレークポイント止めるまではわかりますが、Arreyの中身の表示の仕方が分かりません。 ちなみにCSVのデータは下記の通りです。 Swift,1,丸,罰 Swifta,2,丸,罰 Swiftb,2,丸,罰 初学者で分からないことだらけで申し訳ありません。
TakuyaAso

2019/07/28 06:58

Xcodeのデバックエリアを表示して左側の欄でcsvStrを確認します。あるいはreturn csvStr の前でprint(String(csvStr.count))で何個Arrayに要素があるか確認してください。
Eiki121

2019/07/28 07:23

ありがとうございます。 csvStr [String] 0 values という表示が出ました。 Arreyに要素がない原因はどのようなことが考えられますか??
fuzzball

2019/07/29 02:38

質問内の不要な文章を削除して下さい。
Eiki121

2019/07/29 02:58

質問内の不要な文章がどこを指しているのか分かりません。。。。。
fuzzball

2019/07/29 03:42

「前提・実現したいこと」がテンプレのまま残っています。
Eiki121

2019/07/29 03:58

ご指摘ありがとうございます。訂正しました。
fuzzball

2019/07/31 04:05 編集

回答のコメントを汚すのもあれなのでこっちに書きます。 まず、用意するファイルは loveswift.csv じゃないとダメです。(loadCSV(filename:) の中で拡張子を追加しています) 次に、このファイルのTarget Membershipにチェックが入っているかどうか確認して下さい。File inspectorで確認できます。
Eiki121

2019/07/31 07:40

細かなアドバイスに感謝しています。 Target Membershipにチェックが入っていることを確認しました。
fuzzball

2019/07/31 09:49 編集

読み込めていない前提でコメントが進んでいたので勘違いしていました。ファイルが読めていることは最初に確認していますね。【追記】勘違いでした questionArray = csvArray[questionCount].... の上の行に、 print(questionCount, total, csvArray.count) を追加して、起動〜エラーが出るまでの出力を教えて下さい。
Eiki121

2019/07/31 08:59

2019-07-31 17:57:18.410018+0900 FireLowQuiz[31305:3038288] libMobileGestalt MobileGestalt.c:890: MGIsDeviceOneOfType is not supported on this platform. 0 3 0 Fatal error: Index out of range 2019-07-31 17:57:19.598690+0900 FireLowQuiz[31305:3038288] Fatal error: Index out of range (lldb) このような出力となりました。
fuzzball

2019/07/31 09:07 編集

もしかして「スタートボタン」って前の画面のボタンのことですか?(この画面でボタンを押したら落ちるのかと思ってました)
Eiki121

2019/07/31 09:09

ビルド後の一番最初の画面のボタンのことです!
fuzzball

2019/07/31 09:12

「一番最初の画面」と言われてもこちらには分からないのですけどね‥。(QuizViewControllerが一番最初の画面かも知れないわけで)
fuzzball

2019/07/31 09:18 編集

loveswift.csv を一度プロジェクトから削除して、追加し直してもらえますか?(それで直りそうな気が)
fuzzball

2019/07/31 10:45 編集

たぶんですが、現在のloveswift.csvのファイル名は、頭にスペースが入ってます。そのスペースを削除して下さい。
Eiki121

2019/07/31 09:40

ありがとうございます。 恥ずかしいですが、loveswiftの頭にスペースが入っていたことが原因でした。 また違うエラーが出てますが、自分で調べながらやってみようと思います。笑 これでやっと前に進むことができました。 わざわざ初心者に付き合っていただきありがとうございます。 またお願いします。笑
fuzzball

2019/07/31 10:45

次からでいいですが、コードはテキストでお願いします。コピペや検索が出来ませんので。 あと、解決できたら質問をクローズしておいて下さい。
guest

回答1

0

ベストアンサー

Fatal error: Index out of range

配列の範囲を超えてアクセスしている、というエラーですんで、
そのエラーが出たところで、配列のインデックスをチェックしてみましょう

投稿2019/07/28 05:33

y_waiwai

総合スコア87747

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

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

Eiki121

2019/07/28 06:57

回答ありがとうございます。 配列のインデックスのチェックする項目を具体的に教えていただけないでしょうか。 初学者で分からないことだらけで申し訳ありません。
y_waiwai

2019/07/28 09:52

まずそのエラーが出ている行を特定しましょう 特定できたなら、その行で実行を止め(Xcodeならできたと思いますが)その行の各変数の値を見ていきます
Eiki121

2019/07/29 03:48

csvArrey変数の値が0valuesとなっていたので、CSVの読み込みが上手くいっていないのかなと思い、見直しましたが解決しません。。。
y_waiwai

2019/07/29 03:51

csvファイルの読み込みが失敗してるということですね。 ところで、ファイル名はコードに書いてあるので正しいんでしょうか
Eiki121

2019/07/29 04:11

ファイル名はコード上にあるもので間違いありません。もう一度コードを見直して見ます。
fuzzball

2019/07/29 04:15

拡張子無しですか? loveswift.csvではない?
Eiki121

2019/07/31 03:12

アドバイスありがとうございます。拡張子無しです!有りも一応試したのですが、エラーメッセージは変わりませんでした。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問