当属性可以是整数或布尔值时,啥解析对象?
Posted
技术标签:
【中文标题】当属性可以是整数或布尔值时,啥解析对象?【英文标题】:What parsing object when property can be integer or bool?当属性可以是整数或布尔值时,什么解析对象? 【发布时间】:2018-05-21 18:34:50 【问题描述】:有时服务器会向我发送布尔属性(真、假)。 有时服务器会将属性作为整数 (0,1) 发送给我。
如何通过 Swift 4 中的标准 Decodable 解码这种情况?
示例。 我有:
final class MyOffer : Codable
var id = 0
var pickupAsap: Int?
enum CodingKeys: String, CodingKey
case id
case pickupAsap = "pickup_asap"
来自服务器的响应是:
1) “pickup_all_day”:是的,
2) “pickup_all_day”:0
【问题讨论】:
Swift structures: handling multiple types for a single property的可能重复 【参考方案1】:您可以实现自己的 decode init 方法,从 decode 容器中获取每个类属性,在本节中,让您的逻辑处理“asap”是 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's encoding and decoding doc
【讨论】:
以上是关于当属性可以是整数或布尔值时,啥解析对象?的主要内容,如果未能解决你的问题,请参考以下文章
Javascript - 如何按 3 种不同的属性类型对对象数组进行排序? (字符串、整数、布尔值)