首页 > 解决方案 > 在结构运行时更改属性的名称

问题描述

API 中的 JSON 数据包含各种货币的比特币价格。我需要在运行时修改我的结构,以便它与数据中的键匹配。

初始化、类型别名和泛型不起作用!

'''

struct Model {
    var content : intel  
}

struct intel {
    let last : Float
    let averages : day
    let timestamp : Int64
    let bid : Float
    let ask : Float
}

struct day {
    let day : Float
}
//Intend to change literal value of content at runtime
//Sample Data!

{
    "BTCEUR": {
        "last": 9477.207190353169,
        "averages": {
            "day": 8913.97014278919
        },
        "timestamp": 1561195263,
        "bid": 9473.843088382904,
        "ask": 9477.676160131046
    },
    "BTCUSD": {
        "last": 10791.221908483476,
        "averages": {
            "day": 10149.89204777
        },
        "timestamp": 1561195263,
        "bid": 10787.391373795912,
        "ask": 10791.755900918146
    }
}

'''

标签: iosswiftstruct

解决方案


尝试在运行时更改属性的名称是解决此问题的错误方法。一个更好的解决方案是将您的 JSON 解码为字典。

我们可以像这样创建一个类型别名:

typealias BitcoinData = [String: intel]

并像这样解码数据:

let decoder = JSONDecoder()
let bitcoinData = try! decoder.decode(BitcoinData.self, from: data)
print(bitcoinData["BTCUSD"]!.averages.day) // 10149.892

请注意我们如何BTCUSD使用下标语法进行访问。

事实上,您的 JSON 结构很难解码。如您所见,我们必须在这里解码为字典。如果您可以更改 JSON 结构,那就更好了。


推荐阅读