Swift4中自定义对象数组与String互转及UserDefaults存储问询
解决Swift中自定义对象数组与String的互转(适配UserDefaults存储)
Hey there! 当然可以实现这个需求啦,Swift里借助Codable协议就能轻松搞定自定义对象数组和String的互转,完美适配你要存到UserDefaults的场景。下面一步步给你拆解:
第一步:让你的Tickets类遵守Codable协议
这是整个流程的前提,只有遵守Codable(它是Encodable和Decodable的组合协议),我们才能把对象编码成数据,再转成String,后续也能解码回来。
假设你的Tickets类是这样的,记得加上Codable:
struct Tickets: Codable { // 这里放你实际的属性,比如: var ticketId: Int var ticketTitle: String var ticketStatus: String // 其他属性... // 如果你的属性名和接口返回的JSON字段不一致,还可以用CodingKeys映射: enum CodingKeys: String, CodingKey { case ticketId = "id" case ticketTitle = "title" case ticketStatus = "status" } }
第二步:将[Tickets]数组转换为String
我们会先把数组编码成Data,再转成Base64格式的String(Base64能避免乱码问题,更适合存储):
func ticketsArrayToString(_ tickets: [Tickets]) -> String? { do { // 1. 用JSONEncoder把数组编码成Data let jsonData = try JSONEncoder().encode(tickets) // 2. 将Data转成Base64编码的String return jsonData.base64EncodedString() } catch { print("编码失败:\(error.localizedDescription)") return nil } }
第三步:将String转换回[Tickets]数组
反过来,我们先把Base64 String转回Data,再用JSONDecoder解码成数组:
func stringToTicketsArray(_ string: String) -> [Tickets]? { // 先把String转回Data guard let jsonData = Data(base64Encoded: string) else { print("无法将String转为Data,请检查原字符串是否有效") return nil } do { // 解码成[Tickets]数组 let tickets = try JSONDecoder().decode([Tickets].self, from: jsonData) return tickets } catch { print("解码失败:\(error.localizedDescription)") return nil } }
第四步:存到UserDefaults和取出使用
现在就可以把转换后的String存进UserDefaults,之后再取出转成数组:
// 假设你有一个已获取到的[Tickets]数组:yourTicketsArray if let ticketsString = ticketsArrayToString(yourTicketsArray) { // 存到UserDefaults,key可以自定义,比如"SavedTickets" UserDefaults.standard.set(ticketsString, forKey: "SavedTickets") } // 从UserDefaults取出并转成数组 if let savedString = UserDefaults.standard.string(forKey: "SavedTickets"), let savedTickets = stringToTicketsArray(savedString) { // 这里就拿到了恢复后的[Tickets]数组,直接用就行啦 print("取出的票数组:\(savedTickets)") }
注意事项
- 确保Tickets类里的所有属性都支持Codable:比如如果有自定义子对象,那子对象也要遵守Codable;如果是可选类型也没问题,Codable会自动处理。
- 如果编码/解码失败,记得看控制台的错误信息,通常是属性不匹配或者类型不一致导致的。
内容的提问来源于stack exchange,提问作者Naren
相关产品推荐
相关产品推荐

