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
相关产品推荐
相关产品推荐

