Swift:JSONEcoder EXC_BAD_ACCESS [英] Swift: JSONEcoder EXC_BAD_ACCESS

查看:73
本文介绍了Swift:JSONEcoder EXC_BAD_ACCESS的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在我的Swift应用程序中对一些对象进行编码和解码。我有以下2类。

I want to encode and decode some objects in my Swift app. I have the following 2 classes.

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
        }
    }
}

这是代码,说明我如何编码对象。

And here is the code, how I try to encode the objects.

    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)

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

I think the problem is, that I try to encode an object of the subclass ConsumptionTile but the Array is of type [Tile]. But I don't know how to solve this. I have to to encode all Tile-classes to one data object. Later there will be more subclasses and not just the ConsumptionTile.

我在运行时遇到的错误只是尝试jsonEncoder.encode(defaultTiles)行上的断点与消息线程1:EXC_BAD_ACCESS(代码= 1,地址= 0x8)

The error I get on runtime is just a breakpoint on the try jsonEncoder.encode(defaultTiles) line with the message Thread 1: EXC_BAD_ACCESS (code=1, address=0x8)

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

I hope someone can help. Thank you!

推荐答案

我只是在操场上尝试过,但无法重现该错误。唯一潜在的问题是通过编码-解码过程丢失类型信息,其中 ConsumptionTile 被解码为 Tile

I just tried it in the playground, and I wasn't able to reproduce the error. The only potential problem was the loss of the type information through the encode - decode process, where the ConsumptionTile is decoded as a Tile.

如果将其放在

import Foundation

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

    init(tileSize: TileSize, imageName: String) {
        self.tileSize = tileSize
        self.imageName = imageName
    }

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

class ConsumptionTile: Tile
{
    init(tileSize: TileSize) {
        super.init(tileSize: tileSize, imageName: "")
    }

    required init(from decoder: Decoder) throws {
        fatalError("init(from:) has not been implemented")
    }

    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)

let out = try! JSONDecoder().decode([Tile].self, from: jsonData)
for tile in out {
    print(">>> \(tile.imageName)")
}

这篇关于Swift:JSONEcoder EXC_BAD_ACCESS的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆