当前位置: 首页 > 面试题库 >

Swift 4可解码,直到解码时才知道密钥

皮弘博
2023-03-14
问题内容

Swift 4 Decodable协议如何处理包含名称直到运行时才知道的键的字典?例如:

  [
    {
      "categoryName": "Trending",
      "Trending": [
        {
          "category": "Trending",
          "trailerPrice": "",
          "isFavourit": null,
          "isWatchlist": null
        }
      ]
    },
    {
      "categoryName": "Comedy",
      "Comedy": [
        {
          "category": "Comedy",
          "trailerPrice": "",
          "isFavourit": null,
          "isWatchlist": null
        }
      ]
    }
  ]

在这里,我们有一系列的字典。第一个具有键categoryNameTrending,而第二个具有键categoryNameComedycategoryName键的值告诉我第二个键的名称。如何使用Decodable来表达呢?


问题答案:

关键在于如何定义CodingKeys属性。虽然最常见的情况是enum它可以是符合CodingKey协议的任何内容。要创建动态键,可以调用静态函数:

struct Category: Decodable {
    struct Detail: Decodable {
        var category: String
        var trailerPrice: String
        var isFavorite: Bool?
        var isWatchlist: Bool?
    }

    var name: String
    var detail: Detail

    private struct CodingKeys: CodingKey {
        var intValue: Int?
        var stringValue: String

        init?(intValue: Int) { self.intValue = intValue; self.stringValue = "\(intValue)" }
        init?(stringValue: String) { self.stringValue = stringValue }

        static let name = CodingKeys.make(key: "categoryName")
        static func make(key: String) -> CodingKeys {
            return CodingKeys(stringValue: key)!
        }
    }

    init(from coder: Decoder) throws {
        let container = try coder.container(keyedBy: CodingKeys.self)
        self.name = try container.decode(String.self, forKey: .name)
        self.detail = try container.decode([Detail].self, forKey: .make(key: name)).first!
    }
}

用法:

let jsonData = """
  [
    {
      "categoryName": "Trending",
      "Trending": [
        {
          "category": "Trending",
          "trailerPrice": "",
          "isFavourite": null,
          "isWatchlist": null
        }
      ]
    },
    {
      "categoryName": "Comedy",
      "Comedy": [
        {
          "category": "Comedy",
          "trailerPrice": "",
          "isFavourite": null,
          "isWatchlist": null
        }
      ]
    }
  ]
""".data(using: .utf8)!

let categories = try! JSONDecoder().decode([Category].self, from: jsonData)

(我isFavourit将JSON 更改为,isFavourite因为我认为这是拼写错误。如果不是这种情况,则很容易修改代码)



 类似资料:
  • 我正在为Web应用程序制作登录系统。要将密码存储在数据库中,我正在使用sha256加密密码,如下所示: 在数据库中,我存储了用户、用户密码和用于散列和验证用户登录的salt。现在,我正在向用户发送包含您的密码的电子邮件,但是当用户收到电子邮件时,由于存储在sha256加密密码中,用户收到的是一个长字符串,而不是用户应该知道的密码。 我的问题是,我可以通过任何方法向您发送实际的用户密码和非密码加密,

  • 这样,从加密消息中扫描进来的第一个字母将对应于换位槽中的第三个槽,这将是它被打印出来的地方。然而,我不知道如何将我的想法转化为代码。 电流换位加密密码: 非常基本的换位解密程序

  • 问题内容: 所以,我的json中有iso8601日期,看起来像“ 2016-06-07T17:20:00.000 + 02:00” 有没有办法使用swift4解析这些iso8601日期?我缺少明显的东西吗? 我尝试了以下操作,但是仅jsonShipA中的dateString“ 2016-06-07T17:20:00Z”是可解析的…。 游乐场的输出为: 引发的错误是“预期日期字符串为ISO8601格

  • 这里是一个加密的消息,首先使用3个位置的凯撒密码,然后5个位置。 解密时应该说: 好的,这是我写的类(您将需要所有的导入),我想感谢任何提前帮助的人:

  • 问题内容: 创建公司使用的平台的开发人员不再为我们工作,而且我不知道如何从自定义PHP应用程序中检索密码。 当我查看PHPmyAdmin时,密码已加密(例如* 2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19) 如何更改或检索这些? 问题答案: 如果使用正确的加密方法,将无法轻松检索它们。 只需使用新密码重置即可。 编辑: 字符串看起来像它正在使用:

  • 我正在尝试解密服务器上的加密字符串。但当我解密的时候,我发现了错误。我需要成功解密字符串。我们正在使用AES 256 cbc 当我使用aes/cbc/nopadding时,我能够解密,但是文本中附加了垃圾字符。 解密A:2:{S:5:“电子邮件”;S:24:“afroj.alam@broc.com”;S:8:“密码”;S:7:“test123”;} 实际字符串A:2:{S:5:“email”;S: