Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct RawServerResponse : Codable {
- enum Keys : String, CodingKey {
- case data = "data"
- }
- let data : [String:Base]
- }
- struct Base : Codable {
- enum CodingKeys : String, CodingKey {
- case id = "id"
- case name = "name"
- case symbol = "symbol"
- }
- let id : Int64
- let name : String
- let symbol : String
- }
- struct Quote : Codable {
- enum CodingKeys : String, CodingKey {
- case price = "price"
- case marketCap = "market_cap"
- }
- let price : Double
- let marketCap : Double
- }
- extension RawServerResponse {
- enum BaseKeys : String {
- case btc = "1"
- case eth = "1027"
- }
- var btc : Base? { return data[BaseKeys.btc.rawValue] }
- var eth : Base? { return data[BaseKeys.eth.rawValue] }
- }
- extension Base {
- enum Currencies : String {
- case usd = "USD"
- }
- var usd : Quote? { return quotes[Currencies.usd.rawValue]}
- }
- struct ServerResponse: Codable {
- let btcName: String?
- let btcSymbol: String?
- init(from decoder: Decoder) throws {
- let rawResponse = try RawServerResponse(from: decoder)
- btcSymbol = rawResponse.btc?.symbol
- {
- "data": {
- "1": {
- "id": 1,
- "name": "Bitcoin",
- "symbol": "BTC",
- "website_slug": "bitcoin",
- "rank": 1,
- "circulating_supply": 17041575.0,
- "total_supply": 17041575.0,
- "max_supply": 21000000.0,
- "quotes": {
- "USD": {
- "price": 8214.7,
- "volume_24h": 5473430000.0,
- "market_cap": 139991426153.0,
- "percent_change_1h": 0.09,
- "percent_change_24h": 2.29,
- "percent_change_7d": -2.44
- }
- },
- "last_updated": 1526699671
- },
- "1027": {
- "id": 1027,
- "name": "Ethereum",
- "symbol": "ETH",
- "website_slug": "ethereum",
- "rank": 2,
- "circulating_supply": 99524121.0,
- "total_supply": 99524121.0,
- "max_supply": null,
- "quotes": {
- "USD": {
- "price": 689.891,
- "volume_24h": 2166100000.0,
- "market_cap": 68660795252.0,
- "percent_change_1h": 0.13,
- "percent_change_24h": 2.51,
- "percent_change_7d": 2.54
- }
- }
- 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 : Int64
- let name : String
- let symbol : String
- }
- do {
- let decoder = JSONDecoder()
- decoder.keyDecodingStrategy = .convertFromSnakeCase
- let rawResponse = try decoder.decode(RawServerResponse.self, from: data)
- for (symbol, base) in rawResponse.data {
- print(symbol, base.quotes["USD"]?.marketCap)
- // ETH Optional(68660795252.0)
- // BTC Optional(139991426153.0)
- }
- } catch { print(error) }
Add Comment
Please, Sign In to add comment