Фильтрация массива JSON для отображения нескольких или отдельных значений ключа - PullRequest
0 голосов
/ 04 июня 2018

Этот блок позволяет мне выбрать одну валюту и вернуть все значения API, объявленные в модели.id, symbol, name, price, marketCap и т. Д.

Интерфейс

let data = rawResponse.data
if let eth = data.filter({ (item) -> Bool in
   let cryptocurrency = item.value.symbol
   return cryptocurrency == "ETH"
}).first {
   print(eth)
}

Мне нужна гибкость, чтобывернуть только одно значение, например price.Я мог бы закомментировать все свойства структуры, кроме цены, но это ограничивает функциональность.

Мне сказали, что я могу сравнить let cryptocurrency = item.value.symbol с return cryptocurrency == "ETH" и т. Д., Но я не уверен, как это сделать.

Модель

struct RawServerResponse : Codable {
    var data = [String:Base]()

    private enum CodingKeys: String, CodingKey {
        case data
    }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        let baseDictionary = try container.decode([String:Base].self, forKey: .data)
        baseDictionary.forEach { data[$0.1.symbol] = $0.1 }
    }
}

struct Base : Codable {
    let id : Int?
    let name : String?
    let symbol : String
    let quotes : [String: Quotes]
}

struct Quotes : Codable {
    let price : Double?
}

JSON

"data": {
    "1027": {
        "id": 1027, 
        "name": "Ethereum", 
        "symbol": "ETH", 
        "website_slug": "ethereum", 
        "rank": 2, 
        "circulating_supply": 99859856.0, 
        "total_supply": 99859856.0, 
        "max_supply": null, 
        "quotes": {
            "USD": {
                "price": 604.931, 
                "volume_24h": 1790070000.0, 
                "market_cap": 60408322833.0, 
                "percent_change_1h": -0.09, 
                "percent_change_24h": -2.07, 
                "percent_change_7d": 11.92
            }
        }

1 Ответ

0 голосов
/ 04 июня 2018

Чтобы отфильтровать массив и отобразить единственное значение (или в вашем случае найти Ethereum и использовать цену), вы можете сделать это:

let ethPrice = rawResponse.data.filter({ $0.value.symbol == "ETH" }).first?.price

Вы сделали это слишком сложным.

если это должно быть динамическим, вы можете поместить его в функцию

func getPrice(symbol: String) -> Double? {
    return rawResponse.data.filter({ $0.value.symbol == symbol }).first?.price
}

Вам нужно подумать о том, что вы делаете в небольших работах.

Получите нужный вам объект, который является этой частью

let item = rawResponse.data.filter({ $0.value.symbol == symbol }).first

Тогда у вас есть доступ ко всем свойствам этого одного объекта.

Если вы хотите напечатать название и цену всех предметов, вы можете сделать это довольно легко, также

for item in rawResponse.data {
    print("\(item.symbol) - \(item.price)"
}
...