You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI开发:点击计算按钮后添加结果条件化解释文本

SwiftUI 计算结果解释文本实现方案

核心修改点

  1. 存储原始Double结果:新增状态变量保存计算后的原始数值,方便后续判断逻辑
  2. 添加条件文本显示:根据原始结果值动态展示对应的解释文本
  3. 修复强制解包崩溃问题:用安全的可选绑定处理输入转换,避免程序崩溃

修改后的完整代码

import SwiftUI
struct ContentView: View {
    enum FocusedField {
        case int
    }
    
    @FocusState private var focusedField: FocusedField?
    @State var HPEEP: String = ""
    @State var SetVT: String = ""
    @State var VTHPEEP: String = ""
    @State var LPEEP: String = ""
    @State var VTtotal: String = ""
    @State var Pplat: String = ""
    @State var answer: String = ""
    @State private var rawResult: Double? = nil  // 新增:存储原始计算结果
    @State private var showMenu: Bool = false

    var body: some View {
        NavigationView {
            ZStack {
                Color(.mint)
                    .ignoresSafeArea(.all, edges: .all)
                ScrollView {
                    VStack {
                        HStack {
                            Text("High PEEP")
                                .font(.callout)
                                .padding()
                            Spacer()
                            TextField("cmH2O", text: $HPEEP)
                                .keyboardType(.numberPad)
                                .ignoresSafeArea(.keyboard)
                                .focused($focusedField, equals: .int)
                                .textFieldStyle(.roundedBorder)
                                .frame(width: 80)
                                .padding()
                                .cornerRadius(40)
                        }
                        HStack {
                            Text("Set Tidal Volume")
                                .font(.callout)
                                .padding()
                            Spacer()
                            TextField("ml", text: $SetVT)
                                .keyboardType(.numberPad)
                                .focused($focusedField, equals: .int)
                                .textFieldStyle(.roundedBorder)
                                .frame(width: 80)
                                .padding()
                                .cornerRadius(40)
                        }
                        
                        HStack {
                            Text("Exhaled Tidal Volume at High PEEP")
                                .font(.callout)
                                .padding()
                            Spacer()
                            TextField("ml", text: $VTHPEEP)
                                .keyboardType(.numberPad)
                                .focused($focusedField, equals: .int)
                                .textFieldStyle(.roundedBorder)
                                .frame(width: 80)
                                .padding()
                                .cornerRadius(40)
                        }
                        
                        HStack {
                            Text("Low PEEP")
                                .font(.callout)
                                .padding()
                            Spacer()
                            TextField("cmH2O", text: $LPEEP)
                                .keyboardType(.numberPad)
                                .focused($focusedField, equals: .int)
                                .textFieldStyle(.roundedBorder)
                                .frame(width: 80)
                                .padding()
                                .cornerRadius(40)
                        }
                        
                        HStack {
                            Text("Exhaled Tidal Volume from High to Low PEEP")
                                .font(.callout)
                                .padding()

                            Spacer()
                            TextField("ml", text: $VTtotal)
                                .keyboardType(.numberPad)
                                .focused($focusedField, equals: .int)
                                .textFieldStyle(.roundedBorder)
                                .frame(width: 80)
                                .padding()
                                .cornerRadius(40)
                        }
                        
                        HStack {
                            Text("Plateau Pressure at Low PEEP")
                                .font(.callout)
                                .padding()
                            Spacer()
                            TextField("cmH2O", text: $Pplat)
                                .keyboardType(.numberPad)
                                .focused($focusedField, equals: .int)
                                .textFieldStyle(.roundedBorder)
                                .frame(width: 80)
                                .padding()
                                .cornerRadius(40)
                        }
                        
                        Button {
                            // 安全处理输入转换,避免强制解包崩溃
                            guard let setVT = Double(SetVT),
                                  let pplat = Double(Pplat),
                                  let lpeep = Double(LPEEP),
                                  let hpeep = Double(HPEEP),
                                  let vtTotal = Double(VTtotal),
                                  let vtHPEEP = Double(VTHPEEP),
                                  pplat != lpeep,  // 防止除以0
                                  hpeep != lpeep else {
                                answer = "输入无效"
                                rawResult = nil
                                return
                            }
                            
                            let Cbaby = setVT / (pplat - lpeep)
                            let pVrec = hpeep - lpeep
                            let ppVrec = pVrec * Cbaby
                            let Vrec = vtTotal - vtHPEEP - ppVrec
                            let Crec = Vrec / (hpeep - lpeep)
                            let raw = max(Crec / Cbaby, 0)
                            
                            rawResult = raw  // 保存原始Double结果
                            answer = String(format: "%.2f", raw)
                        } label: {
                            Text("Calculate")
                                .fontWeight(.bold)
                                .frame(width: 200.0, height: 50)
                                .background(Color.blue)
                                .cornerRadius(10)
                                .foregroundColor(.white)
                                .font(.system(size: 20))
                                .padding()
                        }
                        
                        Text("RI = \(answer)")
                            .font(.system(size: 20))
                            .fontWeight(.bold)
                        
                        // 新增:根据结果显示解释文本
                        if let result = rawResult {
                            Text(result < 0.5 ? "XXX" : "YYY")
                                .font(.system(size: 18))
                                .foregroundColor(result < 0.5 ? .red : .green)
                                .padding(.top)
                        }
                        
                        Spacer()
                    }
                }
                
                .navigationTitle("Recruitability")
                .navigationBarTitleDisplayMode(.inline)
                .toolbar {
                    ToolbarItem(placement: .keyboard) {
                        Spacer()
                    }
                    ToolbarItem(placement: .keyboard) {
                        Button {
                            focusedField = nil
                        } label: {
                            Image(systemName: "keyboard.chevron.compact.down")
                        }
                    }
                }

                .toolbar {
                    Button {
                        self.showMenu.toggle()
                    } label: {
                        Image(systemName: showMenu ? "xmark" : "text.justify")
                            .foregroundColor(Color.orange)
                    }
                }
            }
        }
    }
}

关键说明

  • 原始结果存储:用rawResult保存计算后的Double值,避免将字符串转回Double做判断,更高效也更可靠
  • 条件文本:通过if let判断结果是否存在,再用三元运算符选择显示的文本,还可以根据结果设置不同颜色增强视觉反馈
  • 输入安全:用guard let验证所有输入的有效性,包括避免除以0的情况,防止程序崩溃

内容的提问来源于stack exchange,提问作者Alfred Wong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 13:04:55