実現したいこと
・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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。

回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2023/03/07 04:22