在struct的运行时更改属性的名称

时间:2019-06-22 10:29:13

标签: ios swift struct

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
    }
}

'''

1 个答案:

答案 0 :(得分:2)

尝试在运行时更改属性名称是解决此问题的错误方法。更好的解决方案是将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结构,那就更好了。