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

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

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

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

Q&A

解決済

1回答

530閲覧

Switch文:2つTextFieldの値でSwitch文を振り分けたい

matubokkuri

総合スコア5

Swift

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

0グッド

0クリップ

投稿2023/03/03 05:06

実現したいこと

・TextFieldで参照した値をSwitch文でふりわけたい。

前提

2つのTextFieldを使って、SwiftUIで割り算のみの計算アプリを作っています。
計算結果を出力する以外の機能として、TextFieldに入力した値(割る数と割られる数)によってアラート表示の機能を実装している中で問題が発生しました。
なお、アラートはButtonタップ後に表示されるようにしています。

実現させたい挙動

・両方TextField未入力時に、左TextField選択してButtonタップで「割られる数を....」とアラート

・両方TextField未入力時に、右TextField選択してButtonタップで「割る数を....」とアラート

・どちらか一方が未入力の場合は未入力側のTextFieldに該当するアラートを表示(「割られる数を....」or 「割る数を....」)

・右TextFieldに入力された値が0の場合には割ることができないので、(*この時左側には値が入力されている)「割る数には0以外を入力してください」とアラート

・どちらも値が入っている状態でButtonタップで計算結果を出力

*以上の挙動をSwitch文、if let文を使って実装を行なっています

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

①左TextField(割られる数)が未入力の場合、割られる数のアラート表示させたいが、割る数側のアラートが出てしまう*右TextField(割られる数)が未入力の場合は、正常に割る数のアラートが表示されている

②割る数には以外の数...のアラートを表示させるために右TextFieldに0を入力してタップするとアプリが強制終了してしまう

### 該当のソースコード ```SwiftUI import SwiftUI struct ContentView: View { //オプショナルBool型の変数を用意しないと作れないかもしれない @State var leftTextField = "" @State var rightTextField = "" @State private var isError:Bool = false @State var alertMessage = "" @State private var result = "" var body: some View { VStack { HStack { TextField("", text: $leftTextField) Text("÷") TextField("", text: $rightTextField) } .frame(width: 220) .keyboardType(.numberPad) .textFieldStyle(.roundedBorder) Button(action: { //左テキストフィールド let leftTextField = Int(self.leftTextField) switch leftTextField { case nil: isError = true alertMessage = "割られる数を入力して下さい" default: result = "計算できません" } //右テキストフィールド let rightTextField = Int(self.rightTextField) switch rightTextField { case 0 : isError = true alertMessage = "割る数には0以外を入力してください" case nil: isError = true alertMessage = "割る数を入力して下さい" default: result = "計算できません" } if let wapperLeftTextField = leftTextField , let wapperRightTextField = rightTextField { result = "\(wapperLeftTextField / wapperRightTextField)" } else { result = "計算できません" } }, label: { Text("計算") .padding() }).alert(isPresented: $isError) { Alert(title: Text("課題5"), message: Text(alertMessage) )} Text("\(result)") .frame(width: 220,alignment: .leading) } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }

試したこと

・空の状態をnilとして考えずに""(空文字)として置き換えて再度構築を試みています。

現状、知識が足りずどうしても理解ができない部分があり質問いたしました。
ご教授いただけたら幸いです。よろしくお願いいたします。

理解できないこと

・オプショナルの要素をif-letを使っているのに、計算結果を出力するとクラッシュしてしまう原因

・左TextFiled(割られる数)が空(nil)の状態にもかかわらず、case:nil が実行されず、通過してしまって表示右TextFiled(割る数の)のアラートが表示してしまう理由

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ふたつの値をタプルにしてswitchに渡すようにします。

swift

1switch (leftTextField, rightTextField) { 2 case (nil, _): // 左がnil 3 case (_, 0): // 右が0 4 case (_, nil): // 右がnil 5 case (let l?, let r?): // 右が非0かつ両方非nilのとき。lにleftTextField,rにrightTextFieldの値が入ってる 6}

_は値が何であっても条件をクリアしたことになります。
let l?.some(let l)のシンタックスシュガー。lにはアンラップされた値が入る。(Optional<Int>.some(let l)の省略)

投稿2023/03/03 09:31

MasakiHori

総合スコア3391

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

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

matubokkuri

2023/03/07 04:22

解答どおりに修正したら実装できました! 回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問