假設我有A: Codable
帶有子類的父類B1: A
和B2: A
. 我的應用程式中的另一個類Main: Codable
有一個指向 an 的指標,A
它可以是 aB1
或 aB2
但不能是 an A
(我實際上將A
其視為抽象類)。
當我解碼 a 時Main
,我遇到了一個問題,即它被錯誤地解碼為抽象A
而不是 a B1
or B2
,即使存盤的值A
始終是 aB1
或 a B2
。我曾嘗試在子類中實作 custominit(from decoder: Decoder)
和func encode(to encoder: Encoder)
s ,但是當我Main
在運行的應用程式中逐步執行 ' 解碼邏輯時,我從未看到這些子類的實作被呼叫。
這是因為Main
有一個A
并且不知道甚至嘗試將其解碼為 aB1
或 aB2
嗎?我需要專門呼叫這些子類解碼器嗎?如果是后者,則那些子類解碼器無法呼叫父解碼器,因為這會創建一個無限回圈。
這是我的代碼目前的樣子:
class Main: Codable {
let a: A
}
class A: Codable {
}
class B1: A {
let b1Only: Int
private enum CodingKeys: String, CodingKey {
case b1Only
}
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
b1Only = try container.decode(Int.self, forKey: .b1Only)
try super.init(from: decoder)
}
override func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(self.b1Only, forKey: .b1Only)
try super.encode(to: encoder)
}
}
class B2: A {
let b2Only: Int
private enum CodingKeys: String, CodingKey {
case b2Only
}
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
b2Only = try container.decode(Int.self, forKey: .b2Only)
try super.init(from: decoder)
}
override func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(self.b2Only, forKey: .b2Only)
try super.encode(to: encoder)
}
}
uj5u.com熱心網友回復:
您需要自定義init(from:)
并直接Main
解碼a
到正確的子類
class Main: Codable {
let a: A
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
if let object = try? container.decode(B1.self, forKey: .a) {
a = object
} else {
a = try container.decode(B2.self, forKey: .a)
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/454386.html
上一篇:Python:多載魔術方法`__str__`和`__repr__`的回傳型別
下一篇:泛型型別引數和繼承的問題