Swift技术问询:从UserDefaults字典读取数据并显示到标签
从UserDefaults取回体重数据并格式化显示
嘿,作为Swift新手能搞定数据保存这步已经超棒啦!我来帮你把取回数据和格式化显示的部分补全,顺便理清楚关键细节~
首先先把你没写完的保存代码补全(加了空值判断,避免存无效数据):
var weightDict = [String: Any]() var weightArray = [Any]() // 如果要存多条体重记录就用这个数组,单条的话可以不用 @IBAction func saveWeight(_ sender: Any) { weightDict = [:] // 先判断文本框内容非空再存,避免无效数据 if let ounceText = textOunce.text, !ounceText.isEmpty { weightDict["ounce"] = ounceText } if let poundText = textPound.text, !poundText.isEmpty { weightDict["pound"] = poundText } // 单条记录直接存字典到UserDefaults UserDefaults.standard.set(weightDict, forKey: "savedWeight") // 如果要存多条记录,就把字典加到数组再保存 // weightArray.append(weightDict) // UserDefaults.standard.set(weightArray, forKey: "weightHistory") }
接下来是取回数据并格式化显示的代码,你可以把这段放到viewDidLoad里,或者加一个“加载数据”的按钮点击事件里:
func loadAndDisplayWeight() { // 从UserDefaults取回保存的字典,用guard处理没有数据的情况 guard let savedWeightDict = UserDefaults.standard.dictionary(forKey: "savedWeight") else { print("还没有保存的体重数据哦") // 这里也可以给用户显示提示,比如resultLabel.text = "暂无保存数据" return } // 从字典里取出值,转成String,用空字符串兜底避免nil let poundStr = savedWeightDict["pound"] as? String ?? "" let ounceStr = savedWeightDict["ounce"] as? String ?? "" // 把字符串转成数值,方便单位转换和格式化,用0.0兜底处理非数字输入 let poundValue = Double(poundStr) ?? 0.0 let ounceValue = Double(ounceStr) ?? 0.0 // 单位转换逻辑:1磅=16盎司,1盎司≈28.3495克 let totalOunces = poundValue * 16 + ounceValue let gramValue = totalOunces * 28.3495 // 按照你要的格式生成字符串,保留两位小数更美观 let displayText = String(format: "%.2f pounds = %.2f ounces = %.2f grams", poundValue, totalOunces, gramValue) // 把结果显示到你需要的UI控件上,比如label // resultLabel.text = displayText print(displayText) // 先打印测试,确认格式正确 }
几个关键细节提醒:
- 空值处理:不管是保存还是取回,都要处理文本框为空或者数据不存在的情况,避免崩溃
- 类型转换:UserDefaults存的是
Any类型,所以取回后必须转成对应的String/Double,用as?做安全转换 - 单位转换:如果你的需求里不需要计算克数,只是显示用户输入的数值,那可以直接用字符串拼接,不用转成Double
- 多条记录处理:如果是要存多条体重历史,取回的时候要转成
[[String: Any]]类型,然后遍历每个字典生成对应的显示文本
内容的提问来源于stack exchange,提问作者j-s
相关产品推荐
相关产品推荐

