Swift:JSONEcoder EXC_BAD_ACCESS

时间:2017-09-24 10:04:13

标签: ios swift codable

我想在Swift应用程序中对某些对象进行编码和解码。我有以下两个班级。

enum TileSize : Int, Codable
{
    case smallTile = 3
    case mediumTile = 2
    case largeTile = 1
}

class Tile: NSObject, Codable
{
    var tileSize: TileSize = .smallTile
    var imageName: String = "";
    var isDragged = false

    private enum CodingKeys : String, CodingKey
    {
        case tileSize
        case imageName
    }
}

class ConsumptionTile: Tile
{
    override var imageName: String
    {
        get
        {
            return "consumption"
        }
        set
        {
            super.imageName = newValue
        }
    }
}

这是代码,我如何尝试编码对象。

    var defaultTiles : [Tile] = []
    defaultTiles.append(ConsumptionTile(tileSize: .largeTile))
    defaultTiles.append(Tile(tileSize: .largeTile, imageName: "my-devices"))
    defaultTiles.append(Tile(tileSize: .mediumTile, imageName: "live-verbrauch"))
    defaultTiles.append(Tile(tileSize: .smallTile, imageName: "zaehlerstand"))
    defaultTiles.append(Tile(tileSize: .smallTile, imageName: "vertrag"))

    let jsonEncoder = JSONEncoder()
    let jsonData = try jsonEncoder.encode(defaultTiles)

我认为问题是,我尝试编码子类ConsuTile的对象,但Array的类型为[Tile]。但我不知道如何解决这个问题。我必须将所有Tile类编码为一个数据对象。稍后将会有更多的子类,而不仅仅是ConsumerTile。

我在运行时获得的错误只是try jsonEncoder.encode(defaultTiles)行的断点,消息为Thread 1:EXC_BAD_ACCESS(code = 1,address = 0x8)

我希望有人可以提供帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

我刚在操场上试过,我无法重现错误。唯一可能的问题是通过while(true) int u =89; // compile time error - encode流程丢失了类型信息,其中decode被解码为ConsumptionTile

如果你把它放在游乐场并尝试运行它,你会发现自己。

Tile