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

Swift新手求助:点击按钮后将服药时间写入文件的实现方法

Hey there! 作为Swift新手,把服药日志存到文件里其实没你想的那么复杂,我一步步给你拆解实现过程,保证你能看懂👇

实现服药日志写入文件的完整步骤

1. 先定义日志的数据结构

我们需要一个能序列化的结构体来存每次服药的时间,用Codable协议可以轻松把数据转成JSON写入文件:

struct MedicationLog: Codable {
    let timestamp: Date
    // 以后要是想加药品名称、剂量这类字段,直接在这里添加就行,扩展性很强
}

2. 获取日志文件的存储路径

iOS应用里,我们一般把用户数据存在Documents目录下,写个小方法来获取这个文件的URL:

private func getLogFilePath() -> URL? {
    // 先拿到Documents目录的路径
    guard let documentsDir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {
        print("无法访问Documents目录")
        return nil
    }
    // 拼接日志文件名,这里用json格式方便读写
    return documentsDir.appendingPathComponent("medicationLogs.json")
}

3. 读取已有的日志(关键:要追加,不是覆盖)

每次点击按钮时,我们需要先把之前存的所有日志读出来,再把新的日志加进去,这样才不会丢失历史记录:

private func loadExistingLogs() -> [MedicationLog] {
    guard let filePath = getLogFilePath(), FileManager.default.fileExists(atPath: filePath.path) else {
        return [] // 如果文件还不存在,返回空数组就行
    }
    
    do {
        // 读取文件里的Data
        let data = try Data(contentsOf: filePath)
        // 把Data转成日志数组
        let logs = try JSONDecoder().decode([MedicationLog].self, from: data)
        return logs
    } catch {
        print("读取历史日志失败:\(error.localizedDescription)")
        return []
    }
}

4. 写入新的服药日志

把新的日志添加到历史数组里,再整体编码成JSON写入文件:

private func saveNewMedicationLog() {
    // 先读已有日志
    var existingLogs = loadExistingLogs()
    // 创建新的日志条目(当前时间)
    let newLog = MedicationLog(timestamp: Date())
    existingLogs.append(newLog)
    
    do {
        let encoder = JSONEncoder()
        // 用标准的ISO8601格式存日期,以后读取时能准确转成Date对象
        encoder.dateEncodingStrategy = .iso8601
        // 把日志数组编码成Data
        let data = try encoder.encode(existingLogs)
        
        guard let filePath = getLogFilePath() else { return }
        // 写入文件
        try data.write(to: filePath)
        print("服药日志已成功记录!")
        // 这里可以加个用户提示,比如弹出Alert或者Toast
    } catch {
        print("保存日志失败:\(error.localizedDescription)")
    }
}

5. 给“服药”按钮绑定点击事件

最后一步,在你的ViewController里找到按钮的点击方法,调用我们写的保存函数就行:

@IBAction func takeMedicationButtonTapped(_ sender: UIButton) {
    saveNewMedicationLog()
    // 可选:给用户反馈,比如弹出提示框
    let alert = UIAlertController(title: "记录成功", message: "已保存本次服药时间", preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "好的", style: .default))
    present(alert, animated: true)
}

小提示

  • 日期格式:用iso8601编码的日期是标准化的字符串,比如"2024-05-20T14:23:12Z",以后不管是读取还是导出都很方便
  • 错误处理:上面的代码里用了print来输出错误,实际开发中可以换成给用户的友好提示,比如弹窗告诉用户保存失败
  • 文件格式:用JSON是因为它易读易解析,要是以后需要更高效的存储,也可以换成PropertyList或者二进制格式

内容的提问来源于stack exchange,提问作者John Martin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:37:50