繁体   English   中英

Swift 4枚举可编码

[英]Swift 4 enum codable

我从api解析json数据。 我的结构看起来像这样:

struct ServiceUnit: Codable {
        let description,id: String?
        let group, groupDescription:String?
        let name: String?
        var value: MyValue?

        enum CodingKeys: String, CodingKey {
            case description = "Description"
            case group = "Group"
            case groupDescription = "GroupDescription"
            case id = "Id"
            case name = "Name"
            case value = "Value"
        }
    }

    enum MyValue: Codable {
        case string(String)
        case innerItem(InnerItem)

        init(from decoder: Decoder) throws {
            let container = try decoder.singleValueContainer()
            if let string = try? container.decode(String.self) {
                self = .string(string)
                return
            }
            if let innerItem = try? container.decode(InnerItem.self) {
                self = .innerItem(innerItem)
                return
            }
            throw DecodingError.typeMismatch(MyValue.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Wrong type for MyValue"))
        }

        func encode(to encoder: Encoder) throws {
            var container = encoder.singleValueContainer()
            switch self {
            case .string(let x):
                try container.encode(x)
            case .innerItem(let x):
                try container.encode(x)
            }
        }
    }

    struct InnerItem: Codable {
        let type, id, name: String

        enum CodingKeys: String, CodingKey {
            case type = "__type"
            case id = "Id"
            case name = "Name"
        }
    }

和json数据如下所示:

    [
  {
  "Description": null,
  "Group": "Beskrivning av enheten",
  "GroupDescription": null,
  "Id": "Description",
  "Name": "Mer om enheten",
  "Value": "Det finns möjlighet till parkering på gatorna runt om, men det är kantstenar och ganska branta backar för att komma upp till lekplatsen.\r\n\r\nUtanför själva lekplatsen finns en gungställning med en plan omväg in. Alla lekredskap står i sandytor, det finns många kanter. Runt hela lekplatsen går ett staket med öppningar i olika riktningar."
  },
  {
  "Description": null,
  "Group": "Bilder och film",
  "GroupDescription": null,
  "Id": "Image",
  "Name": "Huvudbild",
  "Value": {
      "__type": "FileInfo",
      "Id": "8871b3b1-14f4-4054-8728-636d9da21ace",
      "Name": "ullerudsbacken.jpg"
  }
  }
  ]

加载数据后,我对其进行过滤以仅获取id = description的结果,然后重试value的值,如下所示:

let su = serviceUnit.filter{$0.id == "ShortDescription"}
            let description = su[0].value

然后,我的问题是,当我想使用该值填充标签时,我从Xcode收到此错误:

无法分配类型MyValue?MyValue? 键入String?

如果我打印su ,我得到这个:

[StockholmsParks。(在0x105c3d098处的未知上下文)。ServiceUnit(描述:nil,id:可选(“ ShortDescription”),组:Optional(“ Beskrivning av enheten”),groupDescription:nil,名称:Optional(“ Introduktion”),值:可选(stockholmsParks。(0x105c3d0e8未知上下文).MyValue.string(“Regnbågenpöhöjden.Denhärlekplatsenliggerpåetthögtbergi naturmark,omgivenavhöghus.Detfinnseninstängsladbollplanoch olikalekredskapstårplasradeeftervarandra.Utanför självalekplatsen finns engungställning。Det finnsocksåbänkbordi sol och grillplats。“)))]

我在想什么???

您需要从枚举中获取关联的值。

let value = su[0].value
switch value {
    case .string(let description)?:
        yourLabel.text = description
    default:
        break
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM