不同类型的Json属性

时间:2019-07-23 11:47:15

标签: ios json swift

我有一个从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)-仅是基本对象的副本。

1 个答案:

答案 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