gpt4 book ai didi

swift - 将 Decodable 与继承一起使用会引发异常

转载 作者:搜寻专家 更新时间:2023-10-31 08:22:01 36 4
gpt4 key购买 nike

我正在针对 Rest API 服务工作,其中响应分为基本响应,所有其他响应都继承自它。

我正在尝试使用解码器接口(interface)为我的响应模型类构建相同的结构。

但是我在解码继承类时遇到问题。

我试图关注这个问题: Using Decodable in Swift 4 with Inheritance

但没有运气。

这是初始结构:

class LoginResponse: BaseResponse{

var Message: String?

private enum CodingKeys: String, CodingKey{
case Message
}

required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
Message = try container.decode(String.self, forKey: .Message)
let superDecoder = try container.superDecoder()
try super.init(from: superDecoder)
}
}

class BaseResponse: Decodable {

var Status: Int?

private enum CodingKeys: String, CodingKey{
case Status
}

required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self) // This line throws the exception
Status = try container.decode(Int.self, forKey: .Status)
}
}

这是我尝试解码的方式:

 let decoder = JSONDecoder()
let json = "{\"Message\":\"saa\",\"Status\":200}"
let login = try! decoder.decode(LoginResponse.self, from: json.data(using: .utf8)!)

正如我上面写的,这一行抛出异常(在 BaseResponse 类中)

let container = try decoder.container(keyedBy: CodingKeys.self)


Fatal error: 'try!' expression unexpectedly raised an error: Swift.DecodingError.valueNotFound(Swift.KeyedDecodingContainer<SampleProject.BaseResponse.(CodingKeys in _084835F8074C7E8C5E442FE2163A7A00)>, Swift.DecodingError.Context(codingPath: [Foundation.(_JSONKey in _12768CA107A31EF2DCE034FD75B541C9)(stringValue: "super", intValue: nil)], debugDescription: "Cannot get keyed decoding container -- found null value instead.", underlyingError: nil))

不确定如何处理。

提前致谢!

最佳答案

没有必要使用superDecoder,你可以简单地这样做(我将变量名改为小写以符合命名约定)

class LoginResponse: BaseResponse {

let message: String

private enum CodingKeys: String, CodingKey{
case message = "Message"
}

required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
message = try container.decode(String.self, forKey: .message)
try super.init(from: decoder)
}
}

class BaseResponse: Decodable {

let status: Int

private enum CodingKeys: String, CodingKey{
case status = "Status"
}

required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
status = try container.decode(Int.self, forKey: .status)
}
}
  • decoder.decode(BaseResponse.self ... 只解码status
  • decoder.decode(LoginResponse.self ... 解码状态消息

永远不要使用 try! 进行编码/解码。 处理错误

关于swift - 将 Decodable 与继承一起使用会引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47886046/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com