[英]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.