ios - Swift 4 枚举可编码

标签 ios swift enums 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 收到此错误:

Cannot assign value of type MyValue? to type String?

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

[stockholmsParks.(unknown context at 0x105c3d098).ServiceUnit(description: nil, id: Optional("ShortDescription"), group: Optional("Beskrivning av enheten"), groupDescription: nil, name: Optional("Introduktion"), value: Optional(stockholmsParks.(unknown context at 0x105c3d0e8).MyValue.string("Regnbågen på höjden. Den här lekplatsen ligger på ett högt berg i naturmark, omgiven av höghus. Det finns en instängslad bollplan och olika lekredskap står placerade efter varandra. Utanför själva lekplatsen finns en gungställning. Det finns också bänkbord i sol och grillplats.")))]

我错过了什么???

最佳答案

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

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

关于ios - Swift 4 枚举可编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52717427/

相关文章:

ios - Firebase 和 UISearchbarController 通过服务器而不是客户端搜索 -Swift iOS

ios - 换行符不适用于 Swift 中的 txt 文件

C# 键枚举混淆 : Keys. Alt 或 Keys.RButton |键.ShiftKey |键.Alt

java - 获取枚举 .values()[] 或创建枚举数组?

ios - 链接器命令代码失败并退出 1

ios - 如何在操作点击时关闭 EditActionsForRowat 单元格操作菜单

iOS:推送以运行方法而不显示通知

ios - 从 Kotlin Native 继承 UIView

ios - 在 Xcode 8.2 中编译大型数组文字

json - HashMap 与对象?哪个更好用KEY和VALUE最终生成JSON输出