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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:02:25