我想在我的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
发布评论