Отображение позиций индекса с ключевыми значениями в словарях Swift - PullRequest
0 голосов
/ 02 июня 2018

На основании моей модели я могу
print(crypto, name, price ?? 0.0, totalSupply ?? 0.0)
// BTC Bitcoin 7639.39 17070625.0
// ETH Ethereum 590.943 99826611.0
// all 99 currencies

Я вынужден распечатать все 99 валютв API.Я хочу иметь возможность вишневый пик определенных валют.

Словарь "1" соответствует BTC, а словарь "1021" соответствует ETH.Они не совпадают с ключами "id", но имеют одинаковые числовые значения.

Лучше просто найти элемент "id", а затем использовать условие, которое говорит, что если найдена пара значений ключа "id":1 или "id":1027, вывести все значения в этом словаре?Нужно ли мне карту?Простое условие?

Цель состоит в том, чтобы иметь возможность выбрать одну валюту, т.е. ETH / 1027 и напечатать одну строку, которая в конечном итоге будет помещена в некоторый видТаблица позже.
BTC | Bitcoin | 7639.39 | 17070625.0


Контроллер

for (crypto, base) in rawResponse.data {
                    if let name = base.name {
                        let price = base.quotes["USD"]?.price
                        let totalSupply = base.totalSupply
                        print(crypto, name, price ?? 0.0, totalSupply ?? 0.0)   
                    }

                }

Модель JSON

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 name : String?
let symbol : String
let quotes : [String: Quotes]
}

struct Quotes : Codable {
let price : Double?
let volume24H : Double?
}

JSON

"data": {
    "1": {
        "id": 1, 
        "name": "Bitcoin", 
        "symbol": "BTC", 
        "website_slug": "bitcoin", 
        "rank": 1, 
        "circulating_supply": 17069825.0, 
        "total_supply": 17069825.0, 
        "max_supply": 21000000.0, 
        "quotes": {
            "USD": {
                "price": 7663.22, 
                "volume_24h": 4898370000.0, 
                "market_cap": 130809824337.0, 
                "percent_change_1h": 2.1, 
                "percent_change_24h": 1.17, 
                "percent_change_7d": 2.17
            }
        }, 
        "last_updated": 1527925172
    }, 
    "1027": {
        "id": 1027, 
        "name": "Ethereum", 
        "symbol": "ETH", 
        "website_slug": "ethereum", 
        "rank": 2, 
        "circulating_supply": 99817109.0, 
        "total_supply": 99817109.0, 
        "max_supply": null, 
        "quotes": {
            "USD": {
                "price": 589.299, 
                "volume_24h": 1841640000.0, 
                "market_cap": 58822122295.0, 
                "percent_change_1h": 1.9, 
                "percent_change_24h": 0.93, 
                "percent_change_7d": -0.96
            }
        }

1 Ответ

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

На самом деле я бы посоветовал вам использовать другой API, так как этот формат ответа на самом деле не выглядит удобным для разработки.Однако, если вам нужно его использовать, вот быстрое решение, которое вы можете сделать, чтобы выбрать один элемент:

if let eth = data.filter({ (item) -> Bool in
    guard let crypto = item.value as? Base else {
        return false
    }
    return crypto.symbol == "ETH"
}).first {
    print(eth)
}

if let btc = data.filter({ (item) -> Bool in
    guard let crypto = item.value as? Base else {
        return false
    }
    return crypto.symbol == "BTC"
}).first {
    print(btc)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...