Swift: 将数据解码为继承的对象 class 出现错误
Swift: decode data into object which is an inherited class comes error
我正在将数据解码为对象。型号 classes 是:
class ZZBaseObj: Codable {
var fid: String
init() {
fid = ""
}
private enum CodingKeys:String, CodingKey {
case id
}
required init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
fid = try values.decode(String.self, forKey: CodingKeys.id)
}
}
class ZZFileObj: ZZBaseObj {
var columns:[String]
override init() {
columns = [String]()
super.init()
}
private enum CodingKeys:String, CodingKey {
case columns
}
required init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
columns = try values.decode([String].self, forKey: CodingKeys.columns)
try super.init(from: decoder)
}
}
json 数据如下所示:
(
{
columns = (
"first name",
last,
subject,
address,
age
);
id = "1lYc8iIzMdfdfgjGYMKwO4-X3fWe-4GlzfQ-dfs";
},
{
columns = (
"2018/1/30",
100,
"9800"
);
id = "1fdsafdgfQL-fdfdf-fdf";
}
)
当我尝试使用JSONDecoder()
将数据解码为对象时,没有错误。我得到了 resultArray,在控制台中,我可以看到元素。然后是 EXC_BAD_ACCESS
当涉及到以下代码时:
let obj = resultArray[0]
let content = obj.columns //---------error happens here
我知道这是一个内存问题,但是当我尝试在此处设置断点并在 lldb 中输入时:
po obj.columns
它打印出列的内容。
这让我很困惑。由于 class ZZFileObj
是从 ZZBaseObj
继承的,我想继承缺少一些东西。我尝试创建一个新的 class,其中包括 fid 和列,并且没有出现错误。但是,有一个共同的属性,所以我需要这样一个模型的基础class。
请大家帮忙看看
这是 Swift 4.1
中的一个问题。
https://bugs.swift.org/browse/SR-7090
您现在可以通过从基础 class
中删除 Codable
一致性来修复。一旦问题在即将推出的 Xcode/Swift
版本中得到解决,您就可以恢复原状。
以下是您可以通过将 Codable
移动到基础 class
以最小的努力实现此目的以在将来恢复。您也可以尝试 Xcode 10
的测试版,您当前的代码可能会按预期工作。
class ZZBaseObj {
var id: String
init() {
id = ""
}
private enum CodingKeys:String, CodingKey {
case id
}
required init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
id = try values.decode(String.self, forKey: CodingKeys.id)
}
}
class ZZFileObj: ZZBaseObj, Codable {
var columns:[String]
override init() {
columns = [String]()
super.init()
}
private enum CodingKeys:String, CodingKey {
case columns
}
required init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
columns = try values.decode([String].self, forKey: CodingKeys.columns)
try super.init(from: decoder)
}
}
let json = """
[
{
"columns":["some text 1", "some text 2"],
"id": "1lYc8iIzMdfdfgjGYMKwO4-X3fWe-4GlzfQ-dfs"
},
{
"columns":["some text 3", "some text 4"],
"id": "1lYc8iIzMdfdfgjGYMKwO4-X3fWe-4GlzfQ-dfs"
}
]
""".data(using: .utf8)!
let decoder = JSONDecoder()
let obj = try! decoder.decode([ZZFileObj].self, from: json)
print(obj.first!.columns)
print(obj.first!.id)
输出:
["some text 1", "some text 2"]
1lYc8iIzMdfdfgjGYMKwO4-X3fWe-4GlzfQ-dfs
我正在将数据解码为对象。型号 classes 是:
class ZZBaseObj: Codable {
var fid: String
init() {
fid = ""
}
private enum CodingKeys:String, CodingKey {
case id
}
required init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
fid = try values.decode(String.self, forKey: CodingKeys.id)
}
}
class ZZFileObj: ZZBaseObj {
var columns:[String]
override init() {
columns = [String]()
super.init()
}
private enum CodingKeys:String, CodingKey {
case columns
}
required init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
columns = try values.decode([String].self, forKey: CodingKeys.columns)
try super.init(from: decoder)
}
}
json 数据如下所示:
(
{
columns = (
"first name",
last,
subject,
address,
age
);
id = "1lYc8iIzMdfdfgjGYMKwO4-X3fWe-4GlzfQ-dfs";
},
{
columns = (
"2018/1/30",
100,
"9800"
);
id = "1fdsafdgfQL-fdfdf-fdf";
}
)
当我尝试使用JSONDecoder()
将数据解码为对象时,没有错误。我得到了 resultArray,在控制台中,我可以看到元素。然后是 EXC_BAD_ACCESS
当涉及到以下代码时:
let obj = resultArray[0]
let content = obj.columns //---------error happens here
我知道这是一个内存问题,但是当我尝试在此处设置断点并在 lldb 中输入时:
po obj.columns
它打印出列的内容。
这让我很困惑。由于 class ZZFileObj
是从 ZZBaseObj
继承的,我想继承缺少一些东西。我尝试创建一个新的 class,其中包括 fid 和列,并且没有出现错误。但是,有一个共同的属性,所以我需要这样一个模型的基础class。
请大家帮忙看看
这是 Swift 4.1
中的一个问题。
https://bugs.swift.org/browse/SR-7090
您现在可以通过从基础 class
中删除 Codable
一致性来修复。一旦问题在即将推出的 Xcode/Swift
版本中得到解决,您就可以恢复原状。
以下是您可以通过将 Codable
移动到基础 class
以最小的努力实现此目的以在将来恢复。您也可以尝试 Xcode 10
的测试版,您当前的代码可能会按预期工作。
class ZZBaseObj {
var id: String
init() {
id = ""
}
private enum CodingKeys:String, CodingKey {
case id
}
required init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
id = try values.decode(String.self, forKey: CodingKeys.id)
}
}
class ZZFileObj: ZZBaseObj, Codable {
var columns:[String]
override init() {
columns = [String]()
super.init()
}
private enum CodingKeys:String, CodingKey {
case columns
}
required init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
columns = try values.decode([String].self, forKey: CodingKeys.columns)
try super.init(from: decoder)
}
}
let json = """
[
{
"columns":["some text 1", "some text 2"],
"id": "1lYc8iIzMdfdfgjGYMKwO4-X3fWe-4GlzfQ-dfs"
},
{
"columns":["some text 3", "some text 4"],
"id": "1lYc8iIzMdfdfgjGYMKwO4-X3fWe-4GlzfQ-dfs"
}
]
""".data(using: .utf8)!
let decoder = JSONDecoder()
let obj = try! decoder.decode([ZZFileObj].self, from: json)
print(obj.first!.columns)
print(obj.first!.id)
输出:
["some text 1", "some text 2"]
1lYc8iIzMdfdfgjGYMKwO4-X3fWe-4GlzfQ-dfs