我有一个从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)-仅是基本对象的副本。
答案 0 :(得分:0)
将您的initValue
函数修改为此:
mutating func initValue(value: String){
if case .withParam (var v) = self {
v.params[0].setValue(valueToAdd: value)
self = .withParam(v)
}
}
要更新您的enum
值,您必须将其替换,并且它需要mutating
函数。
此外,我仅用switch
处理的一个case
取代了if case
。