gpt4 book ai didi

ios - 不同类型的 Json 属性

转载 作者:行者123 更新时间:2023-11-29 05:34:36 24 4
gpt4 key购买 nike

我有一个对象,它像这样从 json 反序列化。其中一个 json 属性可能有两种不同的类型(这就是枚举的原因)

enum CarValues: Codable { // this enum to recognize,what type of value in array we need
case withParam(ValuesWithParam)
case withoutParam(ValuesWithoutParam)

func encode(to encoder: Encoder) throws {
var container = encoder.unkeyedContainer()
switch self {
case .withParam(let v): try container.encode(v)
case .withoutParam(let v): try container.encode(v)
}
}

func returnId() -> Int?{
switch self {
case .withParam(let v):
return v.params[0].id
default :
return nil
}
}

func initValue(value: String){

switch self {
case .withParam (var v):
v.params[0].setValue(valueToAdd: value)
default:
_ = ""
}
}

init(from decoder: Decoder) throws {
let value = try decoder.singleValueContainer()

if let v = try? value.decode(ValuesWithParam.self) {
self = .withParam(v)
return
} else if let v = try? value.decode(ValuesWithoutParam.self) {
self = .withoutParam(v)
return
}

throw Values.ParseError.notRecognizedType(value)
}

enum ParseError: Error {
case notRecognizedType(Any)
}
}

struct ValuesWithParam: Decodable, Encodable{
var id: Int
var title: String
var params: [Car]

}

struct ValuesWithoutParam: Decodable, Encodable{
var id: Int
var title: String
}

我想改变这个对象的一些属性,我该怎么做?我尝试在函数 initValue 中执行此操作,但是 (var v) - 只有基本对象的副本。

最佳答案

将您的 initValue 函数修改为:

mutating func initValue(value: String){
if case .withParam (var v) = self {
v.params[0].setValue(valueToAdd: value)
self = .withParam(v)
}
}

要更新您的 enum 值,您必须替换它,并且需要 mutating 函数来执行此操作。

此外,我仅用 if case 处理的一个 case 替换了 switch

关于ios - 不同类型的 Json 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57163545/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com