Swift:将数据解码为继承类的对象时出错

Swift:将数据解码为继承类的对象时出错,swift,inheritance,decode,decodable,Swift,Inheritance,Decode,Decodable,我正在把数据解码成对象。模型类别包括: class ZZBaseObj: Codable { var fid: String init() { fid = "" } private enum CodingKeys:String, CodingKey { case id } required init(from decoder: Decoder) throws { let values = try

我正在把数据解码成对象。模型类别包括:


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";
}
)
当我尝试使用
jsondeconder()
将数据解码为对象时,没有错误。我得到了resultArray,在控制台中,我可以看到元素。然后,当涉及到以下代码时,会出现
EXC\u BAD\u ACCESS


let obj = resultArray[0]
let content = obj.columns //---------error happens here
我知道这是一个内存问题,但当我尝试在这里和lldb input中设置断点时:

po obj.columns
它打印出列的内容。
这使我困惑。由于类
ZZFileObj
是从
ZZBaseObj
继承而来的,我猜继承中缺少了一些东西。我尝试创建一个包含fid和列的新类,但没有出现错误。但是,有一个公共属性,因此我需要为模型提供这样一个基类。

请帮助查看。

这是
Swift 4.1
中的一个问题

您现在可以通过从基本
中删除
可编码
一致性来修复。一旦问题在即将发布的
Xcode/Swift
版本中得到解决,您就可以恢复

下面是通过将
Codable
移动到base
class
来实现这一点的方法,您只需在将来尽可能少地恢复。您还可以在测试版的
xcode10
中尝试,您当前的代码可能会按预期工作

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

“当我尝试使用JSONDecoder()将数据解码为对象时”但是如何?您的对象甚至没有为我编译:“CodingKey大小写'id'与任何存储属性都不匹配”。而且您的JSON似乎无效。@matt,数据是一个示例,不是JSON格式的。您指向了正确的方向!还有一个问题是,你怎么知道有这样一种错误?