我最近开始学习 Swift,现在我正在尝试安全地解包来自 JSON 响应的多个变量,这些变量可能包含或不包含该键。
JSON 响应示例:
{
"products: [{
"foo": "foo"
"bar": "bar"
}, {
"foo": "foo"
}]
}
我正在尝试以下操作:
let dataTask = URLSession.shared.dataTask(with: myURL) { (data, response, error) in
guard let safeData = data else { return }
do {
let json = try JSONSerialization.jsonObject(with: safeData, options: .mutableLeaves)
if let jsonDict = json as? [String : Any] {
let productArray = jsonDict["products"] as? [[String : Any]]
for product in productArray! {
if let foo = product["foo"] as? String, let bar = product["bar"] as? String {
let prod = Product(foo: foo, bar: bar)
products.append(prod)
}
}
}
} catch {
print ("Error: \(error)")
}
}
我想做的是给bar
一个默认值(合并),如果值为nil,比如"Not Available"
,以便显示在一个标签。
这可能吗?我怎么能那样做?
最佳答案
你可以试试
let prod = Product(foo:product["foo"] as? String ?? "Not Available" , bar: product["bar"] as? String ?? "Not Available" )
struct Root: Decodable {
let products: [Product]
}
struct Product: Decodable {
let foo: String
let bar: String?
enum CodingKeys: String, CodingKey {
case foo , bar
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
do {
let foo = try container.decode(String.self, forKey: .foo)
let bar = try container.decodeIfPresent(String.self, forKey: .bar) ?? "Not Available"
self.init(foo:foo, bar:bar)
} catch let error {
print(error)
throw error
}
}
}
关于Swift 4.2 在单个 if-let 中向下转换多个变量时合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53939391/