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

Swift 4如何将结构体写入文件并从文件加载?

Swift 4 结构体数组的文件持久化方案

嗨,欢迎入坑Swift!刚入门就折腾数据持久化,这步子迈得挺扎实呀😉。针对你的需求,用Swift 4引入的Codable协议是最省心的选择——它能帮你轻松完成结构体和JSON(或其他格式)之间的转换,不用手动写一堆解析代码。

第一步:让你的结构体遵循Codable协议

首先得调整你的结构体定义,让它符合Codable(其实Codable是Encodable+Decodable的组合协议,自动帮你实现序列化和反序列化)。另外Swift里类型名建议首字母大写,字段名小驼峰,我帮你调整了下规范:

import Foundation

// 遵循Codable协议,自动获得序列化/反序列化能力
struct MyDataStructure: Codable {
    var data1: String
    var data2: String
    var name: String
    var date: String
    var age: Int
}

// 你的示例数据(调整了字段名大小写,符合Swift规范)
var myVar: [MyDataStructure] = [
    MyDataStructure(data1: "48.1", data2: "-10.1", name: "aaa", date: "2013-12-01 03:22:32", age: 20),
    MyDataStructure(data1: "47.7", data2: "-79.2", name: "bbb", date: "2011-10-15 12:58:45", age: 21),
    MyDataStructure(data1: "50.5", data2: "75.8", name: "ccc", date: "2014-05-20 09:15:00", age: 22)
]

第二步:获取文件存储路径

我们把文件存在App的Documents目录里,这是iOS推荐的持久化存储位置,不会被系统随意清理。写个工具方法来获取路径:

func getDocumentsDirectory() -> URL {
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    return paths[0]
}

// 拼接具体的文件名,比如存成JSON格式
let dataFileURL = getDocumentsDirectory().appendingPathComponent("savedData.json")

第三步:实现保存功能

把结构体数组转成JSON数据,然后写入文件,记得处理可能的错误:

func saveData(to url: URL, data: [MyDataStructure]) {
    let encoder = JSONEncoder()
    // 可选:让生成的JSON更美观,方便调试
    encoder.outputFormatting = .prettyPrinted
    
    do {
        let jsonData = try encoder.encode(data)
        try jsonData.write(to: url)
        print("数据保存成功!")
    } catch {
        print("保存失败:\(error.localizedDescription)")
    }
}

// 调用保存
saveData(to: dataFileURL, data: myVar)

第四步:实现加载功能

读取文件里的JSON数据,再转成结构体数组:

func loadData(from url: URL) -> [MyDataStructure]? {
    do {
        let jsonData = try Data(contentsOf: url)
        let decoder = JSONDecoder()
        let loadedData = try decoder.decode([MyDataStructure].self, from: jsonData)
        print("数据加载成功!")
        return loadedData
    } catch {
        print("加载失败:\(error.localizedDescription)")
        return nil
    }
}

// 调用加载,如果成功就赋值给myVar
if let loadedData = loadData(from: dataFileURL) {
    myVar = loadedData
}

一些小提示

  • 如果你的结构体字段名和JSON里的键需要映射(比如你原来的字段是大写开头),可以用CodingKeys枚举来自定义映射,不过我们上面调整了字段名符合Swift规范,就不需要啦。
  • 除了JSON,你也可以用PropertyListEncoder/PropertyListDecoder来存成plist格式,用法和JSON几乎一样,适合更“原生”的Swift数据存储。
  • 实际项目里,建议把这些持久化逻辑封装成单例或者工具类,避免重复代码。

内容的提问来源于stack exchange,提问作者Pascal N

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:47:00