Swift 4.2 在单个 if-let 中向下转换多个变量时合并

标签 swift default-value downcast coalescing

我最近开始学习 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/

相关文章:

javascript - javascript 中 JSON 的默认值

ant - Ant中如何输出属性值?

c++ - 找到对象类型后,是否可以使用static_cast来强制转换对象?

c++ - 通过队列传递信息时如何避免向下转型?

ios - 对于存储不断增长的数据记录集合,NSUserDefaults 还是 CoreData 更好?

objective-c - 是否可以以编程方式绑定(bind)两个关键路径,在 Cocoa 中设置连续更新?

ruby - Swift 可选与 Ruby ||=

swift - 无法转换类型和参数标签的值...重载

default-value - Netlogo - 乌龟变量的默认值

c++ - 在编译时不知道返回类型时如何避免向下转换?