所以我有這個簡單的 json 回應:
{
"gender": "male",
"name": {
"title": "mr",
"first": "brad",
"last": "gibson"
}
}
這是我的客戶解碼器:
struct UserModel: Decodable {
var gender: String
var title: String?
var first: String?
var last: String?
// Top-level coding keys
enum CodingKeys: String, CodingKey {
case name, gender
}
enum NameKeys: CodingKey {
case title, first, last
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
gender = try container.decode(String.self, forKey: .gender)
let name = try container.nestedContainer(keyedBy: NameKeys.self, forKey: .name)
title = try name.decodeIfPresent(String.self, forKey: .title)
first = try name.decodeIfPresent(String.self, forKey: .first)
last = try name.decodeIfPresent(String.self, forKey: .last)
}
}
如果未發送嵌套物件名稱(title, first, last)中的一個鍵,我知道如何處理錯誤情況。我的問題是,如果“名稱”物件沒有從回應中發回,我將如何撰寫一些東西來防止崩潰?
uj5u.com熱心網友回復:
下面怎么用?
struct Name: Decodable {
var title: String?
var first: String?
var last: String?
}
struct UserModel: Decodable {
var name: Name?
var gender: String
}
然后其他一切都會自行處理。例如,以下所有內容都將被決議而不會出現問題。
{
"gender": "male",
"name": {
"title": "mr",
"first": "brad",
"last": "gibson"
}
}
{
"gender": "male"
}
{
"gender": "male",
"name": {
"title": "mr",
"first": "brad"
}
}
我測驗使用下面
let str = """
{
"gender": "male",
"name": {
"title": "mr",
"first": "brad"
}
}
"""
let usermodel = try! JSONDecoder().decode(UserModel.self, from: str.data(using: .utf8)!)
print(usermodel)
uj5u.com熱心網友回復:
您可以具有嵌套Codable結構,例如:
struct User: Codable {
let gender: String
let name: UserName?
}
struct UserName: Codable {
let title: String?
let first: String?
let last: String?
}
為了使語法更好user.name?.title,我們可以將其更改為僅user.title使用@dynamicMemberLookup. 改成User這樣:
@dynamicMemberLookup
struct User: Codable {
let gender: String
let name: UserName?
subscript<T>(dynamicMember k: KeyPath<UserName, T>) -> T? {
name?[keyPath: k]
}
subscript<T>(dynamicMember k: KeyPath<UserName, T?>) -> T? {
name?[keyPath: k]
}
}
現在,您可以使用簡寫形式來獲取每個屬性。這現在模擬具有所有屬性的單個容器。
uj5u.com熱心網友回復:
感謝 Deepika,這是解決方案:
struct UserModel: Decodable {
var gender: String
var title: String?
var first: String?
var last: String?
// Top-level coding keys
enum CodingKeys: String, CodingKey {
case name, gender
}
enum NameKeys: CodingKey {
case title, first, last
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
gender = try container.decode(String.self, forKey: .gender)
if container.contains(.name) {
let name = try container.nestedContainer(keyedBy: NameKeys.self, forKey: .name)
title = try name.decode(String.self, forKey: .title)
first = try name.decode(String.self, forKey: .first)
last = try name.decode(String.self, forKey: .last)
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/371288.html
上一篇:如何向ReactNative應用程式添加啟影片面(影像或漸變色)
下一篇:SwiftUI有條件地觸發切換
