json: из словаря в структуру

Всем привет, пытаюсь извлечь данные из json словаря в структуру, но не получается, опыта совсем нет, подскажите, что делаю неправильно?

//это json
...
{ BTC_BCN:
   { id: 7,
     last: '0.00000024',
     lowestAsk: '0.00000025',
     highestBid: '0.00000024',
     percentChange: '0.04347826',
     baseVolume: '58.19056621',
     quoteVolume: '245399098.35236773',
     isFrozen: '0',
     high24hr: '0.00000025',
     low24hr: '0.00000022' },
  USDC_BTC:
   { id: 224,
     last: '6437.65329245',
     lowestAsk: '6436.73575054',
     highestBid: '6425.68259132',
     percentChange: '0.00744080',
     baseVolume: '1193053.18913982',
     quoteVolume: '185.43611063',
     isFrozen: '0',
     high24hr: '6499.09114231',
     low24hr: '6370.00000000' },
...

//вот код:

enum APIError: Error {
    case noData
}

protocol APIClient {
    func fetchData(onResult:  @escaping (Result< TickersResp, Error>) -> Void)
   
}

class APIClientclass: APIClient {
    func fetchData(onResult: @escaping (Result< TickersResp, Error>) -> Void) {
        let session = URLSession.shared
        guard let url = URL(string: "https://poloniex.com/public?command=returnTicker") else { return }
        var urlRequest = URLRequest(url: url)
        urlRequest.httpMethod = "GET"
        let dataTask = session.dataTask(with: urlRequest, completionHandler: {data, respoonse, error in
            
            guard let data = data else {
                onResult(.failure(APIError.noData))
                return
                
            }
            do {
             
                let tickersResponse = try JSONDecoder().decode( TickersResp.self, from: data)
                onResult(.success(tickersResponse))
                
            } catch (let error){
                print(error)
                onResult(.failure(error))
            }
            
        })
        dataTask.resume()
        
    }
}

//структуры такие:

typealias TickersResp = [String: Tickers]

struct Tickers: Decodable {
  
    let last: String
    let highestBid: String
    let ​​percentChange: String
   
}

struct TickersModel {
    let namePair: String
    let tickerInfo: Tickers
}

//добавление данных в модель
 

func loadData() {
        api.fetchData(onResult: { result in
            DispatchQueue.main.async {
                switch result {
                case .success(let ticker):
                    for (name, info) in ticker {
                        self.tickers.append(TickersModel(namePair: name, tickerInfo: info))
                    
                    }
                case .failure(_):
                    self.tickers = []
                }
                self.tableView.reloadData()
            }
        })
    }

Ответы (1 шт):

Автор решения: VAndrJ

У Вас, похоже, непечатаемый символ в let ​​percentChange: String

Удалите строку и наберите заново или скопируйте:

struct Tickers: Decodable {
    let last: String
    let highestBid: String
    let percentChange: String
}

Ну и небольшая оптимизация. Замените

for (name, info) in ticker {
    self.tickers.append(TickersModel(namePair: name, tickerInfo: info))
}

на 

self.tickers = ticker.map(TickersModel.init)
→ Ссылка