Guest User

Untitled

a guest
May 23rd, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.06 KB | None | 0 0
  1. struct RawServerResponse : Codable {
  2. enum Keys : String, CodingKey {
  3. case data = "data"
  4. }
  5. let data : [String:Base]
  6. }
  7.  
  8. struct Base : Codable {
  9. enum CodingKeys : String, CodingKey {
  10. case id = "id"
  11. case name = "name"
  12. case symbol = "symbol"
  13. }
  14.  
  15. let id : Int64
  16. let name : String
  17. let symbol : String
  18. }
  19.  
  20. struct Quote : Codable {
  21. enum CodingKeys : String, CodingKey {
  22. case price = "price"
  23. case marketCap = "market_cap"
  24. }
  25.  
  26. let price : Double
  27. let marketCap : Double
  28. }
  29.  
  30. extension RawServerResponse {
  31. enum BaseKeys : String {
  32. case btc = "1"
  33. case eth = "1027"
  34. }
  35. var btc : Base? { return data[BaseKeys.btc.rawValue] }
  36. var eth : Base? { return data[BaseKeys.eth.rawValue] }
  37.  
  38. }
  39.  
  40. extension Base {
  41. enum Currencies : String {
  42. case usd = "USD"
  43. }
  44. var usd : Quote? { return quotes[Currencies.usd.rawValue]}
  45. }
  46.  
  47. struct ServerResponse: Codable {
  48. let btcName: String?
  49. let btcSymbol: String?
  50.  
  51. init(from decoder: Decoder) throws {
  52. let rawResponse = try RawServerResponse(from: decoder)
  53.  
  54. btcSymbol = rawResponse.btc?.symbol
  55.  
  56. {
  57. "data": {
  58. "1": {
  59. "id": 1,
  60. "name": "Bitcoin",
  61. "symbol": "BTC",
  62. "website_slug": "bitcoin",
  63. "rank": 1,
  64. "circulating_supply": 17041575.0,
  65. "total_supply": 17041575.0,
  66. "max_supply": 21000000.0,
  67. "quotes": {
  68. "USD": {
  69. "price": 8214.7,
  70. "volume_24h": 5473430000.0,
  71. "market_cap": 139991426153.0,
  72. "percent_change_1h": 0.09,
  73. "percent_change_24h": 2.29,
  74. "percent_change_7d": -2.44
  75. }
  76. },
  77. "last_updated": 1526699671
  78. },
  79. "1027": {
  80. "id": 1027,
  81. "name": "Ethereum",
  82. "symbol": "ETH",
  83. "website_slug": "ethereum",
  84. "rank": 2,
  85. "circulating_supply": 99524121.0,
  86. "total_supply": 99524121.0,
  87. "max_supply": null,
  88. "quotes": {
  89. "USD": {
  90. "price": 689.891,
  91. "volume_24h": 2166100000.0,
  92. "market_cap": 68660795252.0,
  93. "percent_change_1h": 0.13,
  94. "percent_change_24h": 2.51,
  95. "percent_change_7d": 2.54
  96. }
  97. }
  98.  
  99. struct RawServerResponse : Codable {
  100. var data = [String:Base]()
  101.  
  102. private enum CodingKeys: String, CodingKey { case data }
  103.  
  104. init(from decoder: Decoder) throws {
  105. let container = try decoder.container(keyedBy: CodingKeys.self)
  106. let baseDictionary = try container.decode([String:Base].self, forKey: .data)
  107. baseDictionary.forEach { data[$0.1.symbol] = $0.1 }
  108. }
  109. }
  110.  
  111. struct Base : Codable {
  112. let id : Int64
  113. let name : String
  114. let symbol : String
  115. }
  116.  
  117.  
  118. do {
  119. let decoder = JSONDecoder()
  120. decoder.keyDecodingStrategy = .convertFromSnakeCase
  121. let rawResponse = try decoder.decode(RawServerResponse.self, from: data)
  122. for (symbol, base) in rawResponse.data {
  123. print(symbol, base.quotes["USD"]?.marketCap)
  124. // ETH Optional(68660795252.0)
  125. // BTC Optional(139991426153.0)
  126. }
  127. } catch { print(error) }
Add Comment
Please, Sign In to add comment