一般的なネストされたオブジェクトを使用して json オブジェクトからデコードしようとしています。このために、デコード時にクラスのタイプを動的に渡したいと考えています。
たとえば、私のクラスは ObjectModel (および :Codable) を拡張する EContactModel と ENotificationModel です。ENotificationModel には、ネストされた ObjectModel (連絡先、通知、またはその他のオブジェクトモデル) を含めることができます。
次のような型の辞書があります。
static let OBJECT_STRING_CLASS_MAP = [
"EContactModel" : EContactModel.self,
"ENotificationModel" : ENotificationModel.self
...
]
ENotificationModel のデコード init メソッドは次のようになります。
required init(from decoder: Decoder) throws
{
try super.init(from: decoder)
let values = try decoder.container(keyedBy: CodingKeys.self)
...
//decode some fields here
self.message = try values.decodeIfPresent(String.self, forKey: .message)
...
//decode field "masterObject" of generic type ObjectModel
let cls = ObjectModelTypes.OBJECT_STRING_CLASS_MAP[classNameString]!
let t = type(of: cls)
print(cls) //this prints "EContactModel"
self.masterObject = try values.decodeIfPresent(cls, forKey: .masterObject)
print(t) //prints ObjectModel.Type
print(type(of: self.masterObject!)) //prints ObjectModel
}
私も type(of: anObjectInstanceFromADictionary) を渡そうとしましたが、まだ動作しませんが、 type(of: EContactModel()) を渡すと動作します。両方のオブジェクトが同じ (つまり、EContactModel のインスタンス) であるため、これを理解できません。
これに対する解決策はありますか?