Разбор JSON в Swift 4 (код для начинающих) - PullRequest
0 голосов
/ 17 апреля 2020

Извините заранее, если это глупый вопрос. Я действительно новичок в этом.

Так что я пытаюсь сделать простое приложение, которое показывает текущую bitcoin цену для определенной c валюты, выбранной пользователем.

Сначала я готовлю URL:

let baseURL = "https://api.coindesk.com/v1/bpi/currentprice/"
let currencyArray = ["AUD", "BRL","CAD","CNY","EUR","GBP","HKD","IDR","ILS","INR","JPY","MXN","NOK","NZD","PLN","RON","RUB","SEK","SGD","USD","ZAR"]
    var finalURL = ""

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        finalURL = baseURL + currencyArray[row]
        coinSelected = currencyArray[row]
        getBitcoinData(url: finalURL)
    }

Затем я получаю данные JSON.

Alamofire.request(url, method: .get)
            .responseJSON { response in
                if response.result.isSuccess {
                    let bitcoinJSON = JSON(response.result.value!)
                    print bitcoinJSON

Пока все хорошо, я получаю свои данные JSON, и они печатаются правильно.

{
    "time": {
        "updated": "Apr 17, 2020 08:39:00 UTC",
        "updatedISO": "2020-04-17T08:39:00+00:00",
        "updateduk": "Apr 17, 2020 at 09:39 BST"
    },
    "disclaimer": "This data was produced from the CoinDesk Bitcoin Price Index (USD). Non-USD currency data converted using hourly conversion rate from openexchangerates.org",
    "bpi": {
        "USD": {
            "code": "USD",
            "rate": "7,074.9583",
            "description": "United States Dollar",
            "rate_float": 7074.9583
        },
        "GBP": {
            "code": "GBP",
            "rate": "5,687.3185",
            "description": "British Pound Sterling",
            "rate_float": 5687.3185
        }
    }
}

Что я хочу сделать дальше, это получить курс GBP. (Каким-то образом курс доллара всегда отображается перед выбранной валютой)

Я пытался сделать следующее:

 func updateBitcoinData(json : JSON) {

        let bitcoinRATE = json ["bpi"][1]["rate"]
        print(bitcoinVALUE)

    }

Но он всегда возвращает ноль ...

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Вы не должны обращаться к словарю с таким индексом, как [1]. Элементы в словаре не имеют гарантированного порядка. Сегодня элементы упорядочены по USD, GBP, но завтра это может быть GBP, USD. Технически они все тот же словарь. Поэтому вы всегда должны использовать словарь Key для доступа к нему. например, ["GBP"].

Из контекста вопроса кажется, что вы хотите получить выбранную пользователем валюту, но API всегда будет указывать курс доллара США для справки.

В didSelectRow вы присвоили выбранную валюту coinSelected, поэтому вы можете просто использовать coinSelected в качестве ключа:

if let bitcoinRATE = json["bpi"][coinSelected]["rate"].string {
    // success!
} else {
    // the user has changed the selection before the response is received 
}
0 голосов
/ 17 апреля 2020

Если есть только две валюты, просто найдите ключ first, который не USD

let currencies = bitcoinJSON["bpi"]
if let notUSDCurrency = currencies.dictionary?.keys.first(where: { $0 != "USD" }) {
    let rate = currencies[notUSDCurrency]["rate"].stringValue
    print( "Rate of \(notUSDCurrency):", rate)
}
...