ios - 可编码的类与继承
问题描述
我正在尝试以下代码,但它引发了异常
import Foundation
class SomeBaseClass: Codable {
let someInt: Int?
let someString: String?
init(someInt: Int,someString:String) {
self.someInt = someInt
self.someString = someString
}
init(someBaseClass: SomeBaseClass) {
self.someString = someBaseClass.someString
self.someInt = someBaseClass.someInt
}
}
class Person: SomeBaseClass {
let firstName: String?
let lastName: String?
init(firstName: String,lastName:String,someBaseClass: SomeBaseClass) {
self.firstName = firstName
self.lastName = lastName
super.init(someBaseClass: someBaseClass)
}
enum CodingKeys: String, CodingKey {
case firstName,lastName
}
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
firstName = try container.decode(String.self, forKey: .firstName)
lastName = try container.decode(String.self, forKey: .lastName)
try super.init(from: container.superDecoder())
}
}
let json = """
{
"firstName":"John",
"someInt":2
}
"""
let jsonData = json.data(using: .utf8)!
do {
let personObject = try JSONDecoder().decode(Person.self, from: jsonData)
dump(personObject)
} catch let error as NSError {
print(error)
}
它崩溃并出现以下错误
错误域 = NSCocoaErrorDomain 代码 = 4865 “没有与键 CodingKeys 关联的值(字符串值:“lastName”,intValue:nil)(“lastName”)。” UserInfo={NSDebugDescription=没有与键 CodingKeys 关联的值(stringValue: "lastName", intValue: nil) ("lastName")., NSCodingPath=( )}
我知道lastName
JSON 中缺少它,我已将其标记为可选,但它不像它对结构的工作方式那样工作
有没有一种简单的方法可以做到这一点?
解决方案
你应该使用decodeIfPresent
你的可选属性
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
firstName = try container.decodeIfPresent(String.self, forKey: .firstName)
lastName = try container.decodeIfPresent(String.self, forKey: .lastName)
try super.init(from: decoder)
}
还要注意避免另一个错误所需的对 super 的更改。您也可以从
} catch let error as NSError {
print(error)
}
简单地
} catch {
print(error)
}
推荐阅读
- flutter - Flutter如何将定位的孩子对齐到中心?
- android - 我无法在我的笔记本电脑上运行任何 Github 项目并在运行项目时收到以下错误
- r - 粘贴函数内的下标(ggplot2 实验室)
- excel - 员工轮班时间表
- r - 将所有且仅合适的字符列转换为 data.table 中的数字
- azure - 使用 Azure App Function 的自定义域 URL
- python - python如何读取ftp目录中的最新文件
- mysql - 3 SQL中的连续日期获取
- node.js - tsoa-swagger:上传时文件参数始终未定义
- python - 如何将时间戳日期转换为整数值