🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Q&A

解決済

1回答

553閲覧

Bool値が常にTrueで出力されてしまう

ysda

総合スコア65

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

0グッド

0クリップ

投稿2019/10/21 04:06

前提・実現したいこと

現在電卓アプリを作成しているのですが、その中で「=」ボタンを押した際のBool値の切り替えがうまくできず、その原因を知りたいです。
また、Swift,iOSアプリ開発の勉強をしてまだ間も無いため、コードがかなり拙く解読しにくいかと思いますが、ご教示いただければ幸いです。

問題点

Bool型のequalFlag2にて、「=」ボタン(answerButton)を計算結果が表示された後に押しても何も起こらないように制御しようと考えています。

私の想定としては
①計算結果を表示させるために「=」を押す→計算結果が表示され、equalFlag2がfalseになる
②計算結果が表示されたまま「=」を押す→equalFlag2がfalseの場合、「=」を押しても何も起こらない状態にする
③演算子(+,-,÷,×)を押した際にequalFlag2をtrueにする

しかし現状、「=」のボタンを押したらequalFlag2にfalseを代入しているのにも関わらず、再度「=」ボタンを押下してもequalFlag2のBool値がtrueで出力されてしまいます。

swift

1@IBAction func anserButton(_ sender: UIButton) { //=ボタンを押した時 2 print(equalFlag)//常にtrueで出力されてしまう 3 print(equalFlag2)//常にtrueで出力されてしまう 4 if equalFlag2 == false{//現状意味なし 5 6 Result.text = Result.text! + "" 7 formula.text = formula.text! + "" 8 9 }else{ 10 11 //中略 12 13 equalFlag = false 14 equalFlag2 = false 15 performingMath = false 16 operatorCheck = true 17 print(equalFlag)//falseで出力される 18 print(equalFlag2)//falseで出力される 19 20 } 21

ボタンを押した後に最後falseで代入されているのに、再度押すとtrueになってしまうのはなぜなのでしょうか?
以下に「=」ボタン部分の抜粋とコードの全体像も記載しております。
ご回答いただければ幸いです。

「=」ボタン部分抜粋

swift

1var equalFlag2 = true //計算結果が表示された後に「=」ボタンを押しても何も起こらないように制御する 2 3@IBAction func anserButton(_ sender: UIButton) { //=ボタンを押した時 4 print(equalFlag2)//常にtrueで出力されてしまう 5 if equalFlag2 == false{//現状意味なし 6 7 Result.text = Result.text! + "" 8 formula.text = formula.text! + "" 9 10 }else{ 11 12 if Result.text == "+"||Result.text == "-"||Result.text == "÷"||Result.text == "×"{ 13 14 Result.text = Result.text! + "" 15 formula.text = formula.text! + "" 16 17 } 18 else{ 19 numberOnScreen = Double(Result.text!)!//上のラベルに表示してある数字をDouble型でnumberOnScreenに代入 20 if operation == 14 { //割り算 21 Result.text = String(previousNumber / numberOnScreen) 22 formula.text = secondNumber + String(numberOnScreen) + "=" + String(previousNumber / numberOnScreen) 23 } 24 if operation == 15 { //掛け算 25 Result.text = String(previousNumber * numberOnScreen) 26 formula.text = secondNumber + String(numberOnScreen) + "=" + String(previousNumber * numberOnScreen) 27 } 28 if operation == 16 { //引き算 29 Result.text = String(previousNumber - numberOnScreen) 30 formula.text = secondNumber + String(numberOnScreen) + "=" + String(previousNumber - numberOnScreen) 31 } 32 if operation == 17 { //足し算 33 Result.text = String(previousNumber + numberOnScreen) 34 formula.text = secondNumber + String(numberOnScreen) + "=" + String(previousNumber + numberOnScreen) 35 } 36 } 37 } 38 39 equalFlag = false 40 equalFlag2 = false 41 performingMath = false 42 operatorCheck = true 43 print(equalFlag2)//falseで出力。問題なし 44 45 } 46

コードの全体像

swift

1 2import UIKit 3 4class ViewController: UIViewController { 5 6 var numberOnScreen:Double = 0 //入力した数字と計算結果 7 var previousNumber:Double = 0 //演算子の前の数字 8 var performingMath = false // 9 var operation = 0 10 var secondNumber = "" //[previousNumber + "演算子"] 11 var secondFormula:String = "" // 12 var equalFlag = true //=ボタン押下後のラベル表示結果制御用 13 var equalFlag2 = true //=ボタンを連続で押しても何も起こらないようにする 14 var operatorCheck = true //演算子2回れ連続押せないように制御 15 16 @IBOutlet weak var Result: UILabel! //入力した数字と計算結果表示用 17 @IBOutlet weak var formula: UILabel! //式を表示 18 19 20 override func viewDidLoad() { 21 super.viewDidLoad() 22 // Do any additional setup after loading the view. 23 } 24 25 26 @IBAction func numbers(_ sender: UIButton) {//0~9までの文字 27 28 if performingMath == true { 29 30 Result.text = "0" 31 32 if Result.text != "0"{ //計算結果に表示されている数字が0でなければ、直前の数字と入力した数字をつなげる 33 if equalFlag == true{ 34 Result.text = Result.text! + String(sender.tag-1) 35 formula.text = String(secondNumber) + formula.text! + String(sender.tag-1) 36 } 37 else { //=ボタン押した後 38 Result.text = String(sender.tag-1) 39 formula.text = String(sender.tag-1) 40 equalFlag = true 41 } 42 } else { //計算結果に表示されている数字が0であれば、入力した数字に書き換える 43 Result.text = String(sender.tag-1) 44 formula.text = String(secondNumber) + String(sender.tag-1) 45 } 46 47 performingMath = false 48 49 } 50 else { 51 52 if Result.text != "0" { //計算結果に表示されている数字が0でなければ、直前の数字と入力した数字をつなげる 53 if equalFlag == true{//=ボタンの前 54 55 Result.text = Result.text! + String(sender.tag-1) 56 formula.text = formula.text! + String(sender.tag-1) 57 58 } 59 else{//=ボタンの後 60 61 Result.text = String(sender.tag-1) 62 formula.text = String(sender.tag-1) 63 equalFlag = true 64 65 } 66 67 } else { //計算結果に表示されている数字が0であれば、入力した数字に書き換える 68 Result.text = String(sender.tag-1) 69 formula.text = String(sender.tag-1) 70 } 71 72 } 73 74 } 75 76 77 78 79 @IBAction func calculateButton(_ sender: UIButton) { //演算子の入力 80 81 if sender.tag != 11 && sender.tag != 19 { //Cと=じゃない時。このif文はいらないのでは 82 //演算子押す前の数字をpreviousNumberに代入 83 if performingMath == false { 84 if operatorCheck == true{ 85 previousNumber = Double(Result.text!)! 86 operatorCheck = false 87 if sender.tag == 14 { //÷を押した時 88 Result.text = "÷" //上のラベルに表示 89 formula.text = String(previousNumber) + "÷" //式のラベルに表示 90 } 91 if sender.tag == 15 { //×を押した時 92 Result.text = "×" 93 formula.text = String(previousNumber) + "×" 94 95 } 96 if sender.tag == 16 { //-を押した時 97 Result.text = "-" 98 formula.text = String(previousNumber) + "-" 99 } 100 if sender.tag == 17 { //+を押した時 101 Result.text = "+" 102 formula.text = String(previousNumber) + "+" 103 104 } 105 106 }else{ 107 108 Result.text = "" 109 formula.text = "" 110 111 } 112 113 } 114 115 operation = sender.tag 116 performingMath = true 117 } 118 secondNumber = formula.text! //変数secondNumberに[previousNumber + "演算子"]を代入 119 equalFlag = true 120 equalFlag2 = true 121 122 } 123 124 125 @IBAction func clearButton(_ sender: UIButton) { //Cボタンを押した時 126 Result.text = "0" 127 formula.text = "0" 128 previousNumber = 0 129 numberOnScreen = 0 130 operation = 0 131 performingMath = false 132 equalFlag = true 133 operatorCheck = true 134 equalFlag2 = true 135 } 136 137 138 @IBAction func anserButton(_ sender: UIButton) { //=ボタンを押した時 139 print(equalFlag)//常にtrueで出力されてしまう 140 print(equalFlag2)//常にtrueで出力されてしまう 141 if equalFlag2 == false{//現状意味なし 142 143 Result.text = Result.text! + "" 144 formula.text = formula.text! + "" 145 146 }else{ 147 148 if Result.text == "+"||Result.text == "-"||Result.text == "÷"||Result.text == "×"{ 149 150 Result.text = Result.text! + "" 151 formula.text = formula.text! + "" 152 153 } 154 else{ 155 numberOnScreen = Double(Result.text!)!//上のラベルに表示してある数字をDouble型でnumberOnScreenに代入 156 if operation == 14 { //割り算 157 Result.text = String(previousNumber / numberOnScreen) 158 formula.text = secondNumber + String(numberOnScreen) + "=" + String(previousNumber / numberOnScreen) 159 } 160 if operation == 15 { //掛け算 161 Result.text = String(previousNumber * numberOnScreen) 162 formula.text = secondNumber + String(numberOnScreen) + "=" + String(previousNumber * numberOnScreen) 163 } 164 if operation == 16 { //引き算 165 Result.text = String(previousNumber - numberOnScreen) 166 formula.text = secondNumber + String(numberOnScreen) + "=" + String(previousNumber - numberOnScreen) 167 } 168 if operation == 17 { //足し算 169 Result.text = String(previousNumber + numberOnScreen) 170 formula.text = secondNumber + String(numberOnScreen) + "=" + String(previousNumber + numberOnScreen) 171 } 172 } 173 } 174 175 equalFlag = false 176 equalFlag2 = false 177 performingMath = false 178 operatorCheck = true 179 print(equalFlag2)//falseで出力。問題なし 180 181 182 } 183 184}

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

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

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

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

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

guest

回答1

0

自己解決

解決しました。
=ボタンの接続の仕方が悪かっただけでした。

投稿2019/10/21 04:31

ysda

総合スコア65

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問