[英]Expression Type ambiguous without more context Healthkit ios Swift
[英]Decoding JSON attribute of ambiguous type in iOS Swift
您將如何編寫以下 JSON 的解碼代碼:
{
"identifier": "1",
"issuer": "visa",
"pattern": [5, [7, 9]]
}
將 map 轉換為以下 model:
struct Card: Decodable {
let identifier: String
let issuer: String
let pattern: [CardPattern]
}
enum CardPattern: Decodable {
case prefix(Int)
case range(start: Int, end: Int)
}
請注意 json 中的pattern
屬性如何是兩個可能值的集合:
Int
指示我們應該將 map 轉換為CardPattern.prefix
案例[Int]
包含兩個值,表示我們應該將 map 轉換成CardPattern.range
的情況(第一個值為start
,第二個值為end
)閱讀singleValueContainer
它應該可以解決您的問題。 這是一個帶有測試的工作片段......
enum CardPattern: Codable {
case prefix(Int)
case range(start: Int, end: Int)
init(from decoder: Decoder) throws {
let singleContainer = try decoder.singleValueContainer()
do {
let prefix = try singleContainer.decode(Int.self)
self = .prefix(prefix)
return
} catch {
print("Not a prefix")
}
do {
let range = try singleContainer.decode([Int].self)
self = .range(start: range[0], end: range[1])
return
} catch {
print("Not a range")
}
throw NSError(domain: "Unknown type", code: -1)
}
func encode(to encoder: Encoder) throws {
var singleContainer = encoder.singleValueContainer()
switch self {
case .prefix(let value):
try singleContainer.encode(value)
case .range(start: let start, end: let end):
let range: [Int] = [start, end]
try singleContainer.encode(range)
}
}
}
let data = [CardPattern.prefix(10), CardPattern.range(start: 2, end: 9)]
var encodedData: Data = Data()
do {
encodedData = try JSONEncoder().encode(data)
print(encodedData)
} catch {
print("encode")
print(error)
}
do {
let decoded = try JSONDecoder().decode([CardPattern].self, from: encodedData)
print(decoded)
} catch {
print("decode")
print(error)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.