【问题标题】:Modify the stored struct data to other structure将存储的struct数据修改为其他结构
【发布时间】:2020-03-15 23:00:07
【问题描述】:
struct myStruct1: Codable {
    var field1: String
    var field2: String
    enum CodingKeys: String, CodingKey {
        case field1 = "field1"
        case field2 = "field2"
    }

//Storing the Values to the local file,
//[{"field1":"someValue1","field2":"someValue2"},{"field1":"someValue3","field2":"someValue4"}]

//Now i changed the struct to store an additional field as,

struct myStruct1: Codable {
var field1: String
var field2: String
var field3: String
enum CodingKeys: String, CodingKey {
    case field1 = "field1"
    case field2 = "field2"
    case field3 = "field3"
}

从现在开始,文件中将存储三个字段值,但是对于已经存储的数据将只有两个字段,我需要更新 在文件中存储的数据中新添加field3,默认值为someValue0, 我怎样才能做到这一点。

我说清楚了吗?

【问题讨论】:

  • 用解码器覆盖初始化,如果没有字段3,则将其设置为默认值。然后在本地文件中替换您的值。
  • field3 的存在是可选的吗???还是不会?

标签: ios swift file struct


【解决方案1】:

您可以将其设为可选

 var field3: String?

稍后或更好地分配init并给它赋值

struct myStruct1: Codable {
  var field1: String
  var field2: String
  var field3: String
  enum CodingKeys: String, CodingKey {
      case field1 = "field1"
      case field2 = "field2"
      case field3 = "field3"
  }

      init(from decoder: Decoder) throws {
          let values = try decoder.container(keyedBy: CodingKeys.self)
          field1 = try values.decode(String.self, forKey: .field1)
          field2 = try values.decode(String.self, forKey: .field2)
          field3 = "someValue0"
    }
}

如果filed3存在则做

field3 = try values.decodeIfPresent(String.self, forKey: .field3) ?? ""

【讨论】:

  • try values.decode(Double.self, forKey: .field1), Double.self?真的吗?另外,您不检查field3 是否存在,是否有值,如果不存在,请设置默认值?
  • @Larme 这是一个复制粘贴问题,如果 field3 是否是可选的,也不要从 op 获得,所以两种方式都添加了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-15
  • 1970-01-01
  • 1970-01-01
  • 2019-08-28
相关资源
最近更新 更多