簡體   English   中英

Swift:JSONEcoder EXC_BAD_ACCESS

[英]Swift: JSONEcoder EXC_BAD_ACCESS

我想在Swift應用程序中對一些對象進行編碼和解碼。 我有以下2個課程。

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)

我認為問題是,我嘗試對子類ConsumptionTile的對象進行編碼,但Array的類型為[Tile]。 但是我不知道該怎么解決。 我必須將所有Tile類編碼為一個數據對象。 稍后將有更多的子類,而不僅僅是ConsumptionTile。

我在運行時遇到的錯誤只是帶有消息Thread 1:EXC_BAD_ACCESS(code = 1,address = 0x8)的try jsonEncoder.encode(defaultTiles)行上的一個斷點。

我希望有人能幫幫忙。 謝謝!

我只是在操場上嘗試過,但無法重現該錯誤。 唯一的潛在問題是通過encode - decode過程丟失類型信息,在該過程中, ConsumptionTile被解碼為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)")
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM