Ios 可为具有继承的类编码
我正在尝试以下代码,但它引发了一个异常Ios 可为具有继承的类编码,ios,swift,codable,Ios,Swift,Codable,我正在尝试以下代码,但它引发了一个异常 import Foundation class SomeBaseClass: Codable { let someInt: Int? let someString: String? init(someInt: Int,someString:String) { self.someInt = someInt self.someString = someString } init(so
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)
}
它崩溃时出现以下错误
错误域=NSCOCAERRORDOMAIN代码=4865“没有与关联的值
键编码键(stringValue:“lastName”,intValue:nil)(“lastName”)。”
UserInfo={NSDebugDescription=没有与键关联的值
编码键(stringValue:“lastName”,intValue:nil)(“lastName”)。,
NSCodingPath=()}
我知道JSON中缺少lastName
,我已将其标记为可选,但它的工作方式与结构不同
有没有一个简单的方法可以做到这一点 对于可选属性,您应该使用
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)
}
是的,我知道了,谢谢!但是我有一个问题-如果使用
尝试super.init(from:container.superDecoder())
而不是尝试super.init(from:decoder)
,它会崩溃。这是因为当我调用superDecoder()
时,它在父代中搜索显式声明的解码器,但没有找到它,因此崩溃了吗?我做了一些研究,但我不确定它为什么会崩溃,但老实说,因为它与普通解码器一起工作,所以我没有在研究中投入太多精力。