Какой объект синтаксического анализа, когда свойство может быть целым или логическим?

Иногда сервер отправляет мне свойство как bool (true, false). Иногда сервер отправляет мне свойство в виде целого числа (0,1).

Как я могу декодировать этот случай с помощью стандартного декодирования в Swift 4?

Пример. У меня есть:

final class MyOffer : Codable {
    var id = 0
    var pickupAsap: Int?

    enum CodingKeys: String, CodingKey {
         case id
         case pickupAsap = "pickup_asap"
    }
}

Ответы от сервера:

1) "пикап_все_день": правда,

2) "пикап_все_день": 0


person Yurii Radchenko    schedule 21.05.2018    source источник


Ответы (1)


вы можете реализовать свой собственный метод инициализации декодирования, получить каждое свойство класса из контейнера декодирования, в этом разделе сделайте свою логику, связанную с тем, является ли «как можно скорее» Int или Bool, наконец, подпишите все необходимые свойства класса.

вот простая демонстрация, которую я сделал:

class Demo: Decodable {
    var id = 0
    var pickupAsap: Int?

    enum CodingKeys: String, CodingKey {
        case id
        case pickupAsap = "pickup_asap"
    }

    required init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        let id = try container.decode(Int.self, forKey: .id)
        let pickupAsapBool = try? container.decode(Bool.self, forKey: .pickupAsap)
        let pickupAsapInt = try? container.decode(Int.self, forKey: .pickupAsap)
        self.pickupAsap = pickupAsapInt ?? (pickupAsapBool! ? 1 : 0)
        self.id = id
    }
}

фиктивные данные:

 let jsonInt = """
{"id": 10,
 "pickup_asap": 0
}
""".data(using: .utf8)!

let jsonBool = """
{"id": 10,
 "pickup_asap": true
}
""".data(using: .utf8)!

тест:

let jsonDecoder = JSONDecoder()
let result = try! jsonDecoder.decode(Demo.self, from: jsonInt)
print("asap with Int: \(result.pickupAsap)")

let result2 = try! jsonDecoder.decode(Demo.self, from: jsonBool)
print("asap with Bool: \(result2.pickupAsap)")

выход:

asap with Int: Optional(0)
asap with Bool: Optional(1)

для получения дополнительной информации: документ Apple по кодированию и декодированию

person vg0x00    schedule 23.05.2018