【发布时间】:2021-10-30 18:16:09
【问题描述】:
我目前在测试中遇到以下错误:
如果我正确理解了问题,那么我需要将我的字典转换为解码器。
目前我有下一个代码:
static var validConfirmAuthorizationData: [String: Any] { return json("valid_confirm_authorization_data") }
结构如下:
{
"data": {
"id": "1",
"success": true
}
}
以及我与可解码器一起使用的响应类本身:
public struct SEConfirmAuthorizationResponse: Decodable {
public let id: String
public let success: Bool
enum CodingKeys: String, CodingKey {
case data
}
enum DataCodingKeys: String, CodingKey {
case id
case success
}
public init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let dataContainer = try container.nestedContainer(keyedBy: DataCodingKeys.self, forKey: .data)
id = try dataContainer.decode(String.self, forKey: .id)
success = try dataContainer.decode(Bool.self, forKey: .success)
}
}
【问题讨论】:
-
@JoakimDanielson 抱歉,但我在文章中没有看到任何关于
JSONDecoder的信息。据我了解,我应该这样写:让decoder = JSONDecoder() try decoder.decode(???.self, from: fixture) 但不清楚用什么代替???。 self 因为我有 JSON,它只是一个字符串而不是某个模型的类 -
你有字典吗?为
SEConfirmAuthorizationResponseinit(dictionary: [String: Any])添加方法? -
@Larme 不,我只有
public init(from decoder: Decoder) throws {我扔掉了问题中的示例代码 -
我会这样做:
extension SEConfirmAuthorizationResponse { init?(dict: [String: Any] { guard let id = dict["id"] as? String, let success: dict["success"] as? Bool else { return nil }; self.id = id; self.success = success} }和let response = SEConfirmAuthorizationResponse(dict: fixture)。