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

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

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

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

Q&A

解決済

1回答

1242閲覧

変数に%比率をそれぞれに当てはめ、ユーザーの選んだボタンを蓄積し、最後に健康率は〇〇%です!と出力させたい。

seiya_0930

総合スコア17

Swift

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

0グッド

0クリップ

投稿2019/08/27 10:10

編集2019/08/27 14:36

イメージ説明ヘルスケアアプリを作っています。
swift歴2ヶ月です。

option1button
option2button
option3button
を作り、それぞれ5%、3%、1%と割り振り、問題に答え切った後に、健康率は〇〇%です!と表示させたいです。

ここで問題があり、普通のクイズアプリと違い正解がないので、調べても出てこなかったのですが、それぞれのoptionbuttoonに%比率を当てはめて、最後の結果に表示させたいです。

また、もう一つが、ユーザーの選んだデータを蓄積させたいです。

かなり大雑把な説明となってしまいすみません。
方法や、他の代替案がありましたらアドバイスお願いします。![イメージ説明]イメージ説明(2fc74935288f4f6f14fe3c5eac25135b.png)

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

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

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

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

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

hayabusabusash

2019/08/27 10:28

できた部分まででいいのでコードを貼ることはできますか? このままではやりたい事を書いただけになってしまっているので、 どこまでできていて、どこができないかを質問に書いてみてはいただけないでしょうか?
seiya_0930

2019/08/27 14:37

すみません。おっしゃる通りです。 期限が迫っているので焦ってしまいました。 画像を挿入いたしましたので、ご覧ください。
hayabusabusash

2019/08/27 14:46

追記ありがとうございます! 今出てるエラーを解決すればよろしいのでしょうか? ひとまず出ているエラーは配列の要素数よりも指定したインデックスよりも大きくなってしまっているので発生しているので、一度配列の要素数など確認してはどうでしょうか? 画像をみた感じインデックスが19までの配列に20を指定しているのが原因なんじゃないかなと... あとできればソースコードは画像ではなく文字で入力していただけませんか? マークダウン形式が使えるので、以下のようにすれば上手く貼ることができると思います。 ```Swift // ここにコード ```
seiya_0930

2019/08/27 16:18

すみません!ほんとでした、無事エラー解消できました、ありがとうございます!! 了解です!
seiya_0930

2019/08/27 16:20

```Swift //class nextViewController: UIViewController { // 変数宣言と初期化 var point: Int = 0 var quizNumber: Int = 0 var quizArray: [Quiz] = [] // Storyboard上のパーツについて宣言 @IBOutlet var quizNumberLabel: UILabel! @IBOutlet var quizTextView: UITextView! @IBOutlet var option1Button: UIButton! @IBOutlet var option2Button: UIButton! @IBOutlet var option3Button: UIButton! override func viewDidLoad() { super.viewDidLoad() // クイズのセットアップ setUpQuiz() // クイズ番号、クイズ、各選択肢の表示 showQuiz() // Do any additional setup after loading the view. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func setUpQuiz() { let quiz1 = Quiz(text: "毎日3食食べましたか?", option1:"はい", option2:"時々食べた", option3: "食べていない") let quiz2 = Quiz(text: "決まった時間にご飯を食べていますか?", option1: "食べている", option2: "時々食べる", option3: "食べていない") let quiz3 = Quiz(text: "果物を1日1回は食べていますか?", option1: "はい", option2: "時々食べる", option3: "食べていない") let quiz4 = Quiz(text: "野菜を十分に食べていますか?", option1: "食べている", option2: "日による", option3: "食べていない") let quiz5 = Quiz(text: "インスタンス食品は食べましたか?", option1: "食べていない", option2: "時々食べた", option3: "よく食べた") let quiz6 = Quiz(text: "タバコを吸いましたか?", option1: "吸わない", option2: "たまに吸う", option3: "たくさん吸う") let quiz7 = Quiz(text: "お酒を飲みましたか?", option1: "飲まない", option2: "たまに飲んだ", option3: "飲まない") let quiz8 = Quiz(text: "運動して体を動かしましたか?", option1: "動かした", option2: "たまに動かした", option3: "動かしていない") let quiz9 = Quiz(text: "翌日まで疲れが残ることがありますか?", option1: "特にない", option2: "時々ある", option3: "よくある") let quiz10 = Quiz(text: "食欲がない時がありますか?", option1: "特にない", option2: "時々ある", option3: "よくある") let quiz11 = Quiz(text: "原因不明の下痢などが起こりますか?", option1: "特にない", option2: "時々ある", option3: "よくある") let quiz12 = Quiz(text: "朝スッキリ起きられない時がありますか?", option1: "特にない", option2: "時々ある", option3: "よくある") let quiz13 = Quiz(text: "中々寝付けないことがありますか?", option1: "特にない", option2: "時々ある", option3: "よくある") let quiz14 = Quiz(text: "何事にもやる気が起きにくいですか?", option1: "特にない", option2: "時々ある", option3: "よくある") let quiz15 = Quiz(text:"色々なことに関心が薄くなりますか?", option1: "特にない", option2: "時々ある",option3: "よくある") let quiz16 = Quiz(text: "体調を崩しやすいですか?", option1: "特にない", option2: "時期による", option3: "よく崩す") let quiz17 = Quiz(text: "未来について妙に焦ることがありますか?", option1: "特にない", option2: "時々ある", option3: "よくある") let quiz18 = Quiz(text: "些細なことで腹が立つことがありますか?", option1: "特にない", option2: "時々ある", option3: "よくある") let quiz19 = Quiz(text: "肌荒れの症状が出ることがありますか?", option1: "特にない", option2: "少し荒れる", option3: "よく荒れる") let quiz20 = Quiz(text: "睡眠は十分に取れていますか?", option1: "取れている", option2: "日による", option3: "取れていない") quizArray.append(quiz1) quizArray.append(quiz2) quizArray.append(quiz3) quizArray.append(quiz4) quizArray.append(quiz5) quizArray.append(quiz6) quizArray.append(quiz7) quizArray.append(quiz8) quizArray.append(quiz9) quizArray.append(quiz10) quizArray.append(quiz11) quizArray.append(quiz12) quizArray.append(quiz13) quizArray.append(quiz14) quizArray.append(quiz15) quizArray.append(quiz16) quizArray.append(quiz17) quizArray.append(quiz18) quizArray.append(quiz19) quizArray.append(quiz20) } //クイズを各パーツに表示 func showQuiz() { //クイズ番号、クイズ、各選択肢の表示 quizNumberLabel.text = String(quizNumber + 1) + "問目" quizTextView.text = quizArray[quizNumber].text option1Button.setTitle(quizArray[quizNumber].option1 , for:.normal ) option2Button.setTitle(quizArray[quizNumber].option2, for: .normal) option3Button.setTitle(quizArray[quizNumber].option3, for: .normal) } //クイズのデータをリセット func resetQuiz() { point = 0 quizNumber = 0 self.showQuiz() } //クイズをアップデート func updataQuiz() { if quizNumber == 19 { self.performSegue(withIdentifier: "toSecond", sender: nil) } else { quizNumber = quizNumber + 1 showQuiz() } } @IBAction func pushOption1Button() { updataQuiz() } @IBAction func pushOption2Button() { updataQuiz() } @IBAction func pushOption3Button() { updataQuiz() } } ```
seiya_0930

2019/08/27 16:21

```Swift //class Quiz: NSObject { // クイズ1つの問題がどんな値を扱うかうか var text: String var option1: String var option2: String var option3: String // Initializer(イニシャライザ) = 初期化処理 init(text: String, option1: String, option2: String, option3: String) { self.text = text self.option1 = option1 self.option2 = option2 self.option3 = option3 } } ```
seiya_0930

2019/08/27 16:22

1つ目がviewcontrollerのコードで2つ目がNSobjectのクイズコードです。
seiya_0930

2019/08/27 16:23

point = 0 の変数をうまく利用できないかと考得ているのですが、活用方法が見出せません。
hayabusabusash

2019/08/27 23:30

なるほど、詳しい情報ありがとうございます! 回答するので少々お待ちください。 ひとまずここに書いていただいた情報やコードなどを質問の方にも記述していただけませんか?
guest

回答1

0

ベストアンサー

まずQuizですが、
情報が更新されることはなさそうなのでクラスではなく構造体にしました。

Swift

1struct Quiz { 2 let text: String 3 let optionOne: String 4 let optionTwo: String 5 let optionThree: String 6 7 init(text: String, optionOne: String, optionTwo: String, optionThree: String) { 8 self.text = text 9 self.optionOne = optionOne 10 self.optionTwo = optionTwo 11 self.optionThree = optionThree 12 } 13}

ここで問題があり、普通のクイズアプリと違い正解がないので、調べても出てこなかったのですが、それぞれのoptionbuttoonに%比率を当てはめて、最後の結果に表示させたいです。

この部分ですが、
それぞれのボタンタップ時にpointに加算するようにすればいいと思います。
以下のようにしてみました。

Swift

1 @IBAction func pushOption1Button() { 2 // Option1 のボタンを押したのでPointに5%加算 3 point += 5 4 updataQuiz() 5 } 6 7 @IBAction func pushOption2Button() { 8 // Option2 のボタンを押したのでPointに3%加算 9 point += 3 10 updataQuiz() 11 } 12 13 @IBAction func pushOption3Button() { 14 // Option3 のボタンを押したのでPointに1%加算 15 point += 1 16 updataQuiz() 17 }

また、もう一つが、ユーザーの選んだデータを蓄積させたいです。

これに関してはデータベースが必要になります。
数人程度のデータならUserDefaultでも問題なさそうですが、
より多くのデータを蓄積する必要があるならモバイルデータベースのRealmを使った方がいいと思います。

簡単にですがサンプルのプロジェクトを作ってみたのでご確認ください。(データベースの処理は実装していません)

2019/08/28追記(遷移について)

合計結果を示す場合、異なるviewcontrollerに表示されるんですが、このデータをそのviewcontrollerに表示させるには同じ変数を扱えば良いですか?

そうですね、
画面遷移する際に値を渡してしまえばいいと思います。

遷移先のViewControllerに同じようなIntの変数を作って、
そこに渡してしまうような形になると思います。

segueではあんまり遷移したことがなくて自信がないので、
詳しくは参考サイトを参照してください...

Swift

1// 遷移先のViewController 2class ResultViewController: UIViewController { 3 4 // ここにpointを渡す 5 var result: Int = 0 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 10 // resultを表示する処理 ... 11 // 省略します 12 } 13}

Swift

1// 遷移前のViewController 2class nextViewController: UIViewController { 3 4 // 略... 5 6 func updataQuiz() { 7 if quizNumber == 19 { 8 performSegue(withIdentifier: "Segueのidentifier", sender: nil) 9 } else { 10 // 略... 11 } 12 } 13 14 // 遷移前の準備 15 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 16 if segue.identifier == "Segueのidentifier" { 17 let resultVC = segue.destination as! ResultViewController 18 resultVC.result = point 19 } 20 } 21}

投稿2019/08/28 00:58

編集2019/08/28 05:44
hayabusabusash

総合スコア767

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

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

seiya_0930

2019/08/28 05:14

本当に、本当に丁寧にありがとうございます!!!! 初めて2ヶ月の未熟者にここまで手の込んだコードまで組んでいただき本当に感謝しています、、、 だいぶ前進しました、これからrealmについて勉強したいと思います。 合計結果を示す場合、異なるviewcontrollerに表示されるんですが、このデータをそのviewcontrollerに表示させるには同じ変数を扱えば良いですか?
hayabusabusash

2019/08/28 05:44

追記しました!ご確認ください。
seiya_0930

2019/08/28 06:14

なるほど。本当にありがとうございます。 先ほど、hayabusabusashさんのコードを参考に入力してみたのですが、この別のviewcontrollerに遷移しないほうがスタイリッシュで良いと思ったのですが、そこはどちらでも良いですか?
hayabusabusash

2019/08/28 06:17

その辺は好みで大丈夫だと思いますよ! もし他にも表示したい項目がたくさんあるなら別のViewControllerに遷移すべきかと思いますが、 現状結果だけなので遷移しなくても問題ないと思います。
seiya_0930

2019/08/28 06:24

ありがとうございます。 とりあえず遷移しない方向で完成に近づけて行きたいと思います。 本当に親切にありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問