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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:33:31