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

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

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

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

Swift

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

Q&A

解決済

2回答

180閲覧

条件分岐について(if文)

退会済みユーザー

退会済みユーザー

総合スコア0

Xcode

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

Swift

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

0グッド

0クリップ

投稿2018/09/16 16:06

編集2018/09/18 16:56

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 6 @IBOutlet weak var calcProc: UITextView! 7 @IBOutlet weak var rsltlbl: UILabel! 8 var dataSource = DataSource() 9 var previousNumber: Double = 0 10 var operation = 0 11 12 @IBAction func tapNum(_ sender: Any) { 13 //let text = (sender as AnyObject).tag == 10 ? "+" : String((sender as AnyObject).tag) 14 let text: String 15 if (sender as AnyObject).tag == 10 { 16 text = "." 17 }else{ 18 text = String((sender as AnyObject).tag) 19 } 20 21 dataSource.upDate(value: text) 22 labelUpdate() 23 } 24 25 @IBAction func calcItem(_ sender: Any) { 26 27 let text: String 28 29 if (sender as AnyObject).tag == 11 //Plus 30 { 31 text = "+" 32 } 33 else if (sender as AnyObject).tag == 12 //Multiply 34 { 35 text = "-" 36 } 37 else if (sender as AnyObject).tag == 13 //Minus 38 { 39 text = "×" 40 } 41 else if (sender as AnyObject).tag == 14//Divide 42 { 43 text = "÷" 44 } 45 else{ 46 text = String((sender as AnyObject).tag) 47 } 48 49 let num: Double = Double(dataSource.pText)! 50 operation = (sender as AnyObject).tag 51 52 if operation == 11 && (sender as AnyObject).tag != 1 && (sender as AnyObject).tag != 10 53 { 54 dataSource.pText = String(num + num); 55 } 56 if operation == 12 57 { 58 dataSource.pText = String(num - num); 59 } 60 if operation == 13 61 { 62 dataSource.pText = String(num * num); 63 } 64 if operation == 14 65 { 66 dataSource.pText = String(num / num); 67 } 68 dataSource.upDate(value: text) 69 labelUpdate() 70 71 72 }

やりたいこと

入力された値を計算したい。
if文で各記号タグが選択された時に計算せずに次に入力した値を元と最初に入力した値を計算したい

現状

+,-,*,/の記号を選択した時に計算されてしまう。

###困っていること
意図していないタイミングで計算されるため、計算結果がおかしくなる。

###改善したいこと
if文の書き方が的確でないため意図しない結果になっていると思うのでどのようにif文を書けばいいかを知りたい。

現コード

swift

1@IBAction func tapNum(_ sender: Any) { 2 //let text = (sender as AnyObject).tag == 10 ? "+" : String((sender as AnyObject).tag) 3 var text: String 4 if (sender as AnyObject).tag == 10 { 5 text = "." 6 }else{ 7 text = String((sender as AnyObject).tag) 8 } 9 10 dataSource.upDate(value: text) 11 labelUpdate() 12 13 let num: Double = Double(dataSource.pText)! 14 operation = (sender as AnyObject).tag 15 16 if operation == 0 && (sender as AnyObject).tag != 1 && (sender as AnyObject).tag != 10 17 { 18 if operation == 11 19 { 20 text = String(num + num) 21 } 22 if operation == 12 23 { 24 text = String(num - num) 25 } 26 if operation == 13 27 { 28 text = String(num * num) 29 } 30 if operation == 14 31 { 32 text = String(num / num) 33 } 34 } 35 if operation == 1 36 { 37 if operation == 11 38 { 39 text = String(num + num) 40 } 41 if operation == 12 42 { 43 text = String(num - num) 44 } 45 if operation == 13 46 { 47 text = String(num * num) 48 } 49 if operation == 14 50 { 51 text = String(num / num) 52 } 53 } 54 if operation == 2 55 { 56 if operation == 11 57 { 58 text = String(num + num) 59 } 60 if operation == 12 61 { 62 text = String(num - num) 63 } 64 if operation == 13 65 { 66 text = String(num * num) 67 } 68 if operation == 14 69 { 70 text = String(num / num) 71 } 72 } 73 if operation == 3 74 { 75 if operation == 11 76 { 77 text = String(num + num) 78 } 79 if operation == 12 80 { 81 text = String(num - num) 82 } 83 if operation == 13 84 { 85 text = String(num * num) 86 } 87 if operation == 14 88 { 89 text = String(num / num) 90 } 91 } 92 if operation == 4 93 { 94 if operation == 11 95 { 96 text = String(num + num) 97 } 98 if operation == 12 99 { 100 text = String(num - num) 101 } 102 if operation == 13 103 { 104 text = String(num * num) 105 } 106 if operation == 14 107 { 108 text = String(num / num) 109 } 110 } 111 if operation == 5 112 { 113 if operation == 11 114 { 115 text = String(num + num) 116 } 117 if operation == 12 118 { 119 text = String(num - num) 120 } 121 if operation == 13 122 { 123 text = String(num * num) 124 } 125 if operation == 14 126 { 127 text = String(num / num) 128 } 129 } 130 if operation == 6 131 { 132 if operation == 11 133 { 134 text = String(num + num) 135 } 136 if operation == 12 137 { 138 text = String(num - num) 139 } 140 if operation == 13 141 { 142 text = String(num * num) 143 } 144 if operation == 14 145 { 146 text = String(num / num) 147 } 148 } 149 if operation == 7 150 { 151 if operation == 11 152 { 153 text = String(num + num) 154 } 155 if operation == 12 156 { 157 text = String(num - num) 158 } 159 if operation == 13 160 { 161 text = String(num * num) 162 } 163 if operation == 14 164 { 165 text = String(num / num) 166 } 167 } 168 if operation == 8 169 { 170 if operation == 11 171 { 172 text = String(num + num) 173 } 174 if operation == 12 175 { 176 text = String(num - num) 177 } 178 if operation == 13 179 { 180 text = String(num * num) 181 } 182 if operation == 14 183 { 184 text = String(num / num) 185 } 186 } 187 if operation == 9 188 { 189 if operation == 11 190 { 191 text = String(num + num) 192 } 193 if operation == 12 194 { 195 text = String(num - num) 196 } 197 if operation == 13 198 { 199 text = String(num * num) 200 } 201 if operation == 14 202 { 203 text = String(num / num) 204 } 205 } 206 207 //dataSource.upDate(value: text) 208 //labelUpdate() 209 } 210 211 @IBAction func calcItem(_ sender: Any) { 212 213 let text: String 214 215 if (sender as AnyObject).tag == 11 //Plus 216 { 217 text = "+" 218 } 219 else if (sender as AnyObject).tag == 12 //Multiply 220 { 221 text = "-" 222 } 223 else if (sender as AnyObject).tag == 13 //Minus 224 { 225 text = "×" 226 } 227 else if (sender as AnyObject).tag == 14//Divide 228 { 229 text = "÷" 230 } 231 else{ 232 text = String((sender as AnyObject).tag) 233 } 234 235 dataSource.upDate(value: text) 236 labelUpdate() 237 238 }

色々試してみましたがどうしても意図したタイミングで計算されません。
処理の流れやどこを直せばいいか知りたいです。

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

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

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

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

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

torisan

2018/09/19 00:59

電卓っぽいですが、+,-,*,/の記号を選択した時に計算『されてしまう』とあるので、違うのでしょうか。どのような画面があって、何をどうした時にどうなる予定が、こうなってしまう。という細かい仕様を記載して下さい。また、色々試したとありますが、何を試してどうなったのかを教えてください。
guest

回答2

0

「やりたいこと」が実現できない原因は、if文の書き方の問題ではないと思います。

「意図していないタイミングで計算されるため、計算結果がおかしくなる。」
ということまでわかっているのだと思いますが、だとしたら計算するタイミングを変えないと、
if文の書き方をいくら変えてもタイミングは変わりません、

つまり、「+,-,*,/」の演算記号を選択した時に計算するのではなく、
次に数字を入力した時に計算したいのであれば、
演算記号をタップした時に呼ばれるcalcItemの処理で計算するのではなく、
数字をタップした時に呼ばれるtapNumの処理で計算する必要があると思います。

投稿2018/09/17 05:04

TakeOne

総合スコア6299

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

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

退会済みユーザー

退会済みユーザー

2018/09/18 16:59

tapNumで計算処理を書いてみたのですが計算できませんでした。 計算処理は関数にしたほうがいいですか?
TakeOne

2018/09/19 01:09

正しく計算できない処理を関数にしても、正しく計算できないということに変わりはないと思います。
TakeOne

2018/09/19 06:00 編集

修正したコードが追記されているのを今見つけたのでもう少しコメントすると、数字をタップした時に計算する場合、直前にどの演算子がタップされたかを覚えておいて、それを見て足し算するかかけ算するか判断する必要がありますよね。そのためにoperationという名前のプロパティを宣言したのだと思いますが、そのoperationがうまく使えていないと思います。oprationにはどの演算子がタップされたかを覚えておく用途に使えばよいのであって、数字がタップされた時にその数字の値をoperationに保存しても何の役にも立たないと思います。
guest

0

ベストアンサー

計算処理について(電卓ライクなアプリ) にも回答しましたが、
依然として、根本的に基礎知識が不足しており、見当違いな方針になっていると感じています。

基礎知識の習得を行わずに、まずは実践という方針なのだと思いますが、
そうであれば、もっとシンプルな内容が実現できる試してみてはいかがでしょうか?

例えばですが、

  • ボタンは1つだけで、ボタンをタップすると1つ値が加算されるカウンタ
  • それができたら、ボタンを1つ増やし、そのボタンをタップすると1つ値が減算される

という形で少しずつできることを増やしてどこまでは実現できて、
どこからができないのかを明確にできれば、何を学ぶべきかも実感として湧いてくるかもしれません。

投稿2018/09/20 16:03

ykws

総合スコア1236

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問