簡體   English   中英

Swift 自定義解碼 - 加入屬性

[英]Swift custom decoding - joining properties

我正在嘗試使用下面的以下對象解碼像MyPets這樣的對象。 我嘗試使用 4 CodingKeys cat、dog、catName 和 dogName,但由於這些名稱不在 MyPets 結構中,因此它們不可用於解碼,然后與其他名稱一起填充DogCat結構。 我還嘗試了 nestedContainer 作為名稱屬性,但沒有成功。 有任何想法嗎? 謝謝!

struct MyPets: Decodable {
  let dog: Dog
  let cat: Cat

  // enum CodingKeys: String, CodingKey {
  //   case dog 
  //   case cat
  //   case catName
  //   case dogName
  // }

   public init(from decoder: Decoder) throws {
    let values = try decoder.container(keyedBy: CodingKeys.self)
    // values only has dog and cat
   }
}

struct Dog {
  let name: String
  let weight: Int
  let food: String
}

struct Cat {
  let name: String
  let weight: Int
  let food: String
}

具有以下對象:

{
   "catName": "fluffy", 
   "dogName": "softy", 
   "cat": {
       "food": "fancyFeast", 
       "weight": "8"
   }, 
   "dog": {
       "food": "kibble", 
       "weight": "9"
   }
}

我想做這樣的事情來重新創建 Cat 結構

let catName = (try values.decode(String.self, forKey: .catName))
self.cat = Cat(name: catName, etc...)

這可以通過使用兩個不同的CodingKey枚舉來使用,一個用於實際屬性,另一個用於我們解碼為局部變量。

struct MyPets: Decodable {
    var dog: Dog
    var cat: Cat

    enum CodingKeys: String, CodingKey {
        case dog
        case cat
    }

    enum HiddenKeys: String, CodingKey {
        case dogName
        case catName
    }

然后我們通過創建兩個不同的容器在init(from:)中使用它們

init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: CodingKeys.self)

    dog = try container.decode(Dog.self, forKey: .dog)
    cat = try container.decode(Cat.self, forKey: .cat)

    let otherContainer = try decoder.container(keyedBy: HiddenKeys.self)

    let dogName = try otherContainer.decode(String.self, forKey: .dogName)
    let catName = try otherContainer.decode(String.self, forKey: .catName)

    self.dog.name = dogName
    self.cat.name = catName
}

DogCat (此處未顯示)也需要符合Decodable並使用它們自己的CodingKey枚舉

struct Dog: Decodable {
    var name: String = ""
    let weight: Int
    let food: String

    enum CodingKeys: String, CodingKey {
        case weight, food
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM