Я пытаюсь создать приложение, которое отображает курсы обмена валют, используя API Alpha Vantage для iOS. Я создал функции, но не могу понять, как получить доступ к точному значению json, которое равно «5. Обменный курс».
Вот некоторый код и данные json, которые помогут лучше объяснить:
Созданный URL:
func USDtoEUR(_ completionHandler: @escaping (_ success: Bool, _ quotes: [String:AnyObject]?, _ error: String?) -> Void) {
let urlString = "https://www.alphavantage.co/query?function=CURRENCY_EXCHANGE_RATE&from_currency=USD&to_currency=EUR&apikey=NP3M8LL62YJDO0YX"
let session = URLSession.shared
let url = URL(string: urlString)!
let request = URLRequest(url: url)
let task = session.dataTask(with: request, completionHandler: { data, response, error in
if error != nil {
completionHandler(false, nil, error!.localizedDescription)
}
else {
do {
let result = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.allowFragments) as! NSDictionary
if let dictionary = result["Realtime Currency Exchange Rate"] as? [String:AnyObject]! {
completionHandler(true, dictionary, nil)
}
else {
completionHandler(false, nil, nil)
}
} catch {
completionHandler(false, nil, "Unable to process retrieved data.")
}
}
})
task.resume()
}
Котировки в контроллере представления
func usdQUotesRequest() {
USDClient().USDtoEUR() { success, newQuote, error in
if success {
self.usdtoeurquote = newQuote
DispatchQueue.main.async {
self.stopActivityIndicator()
self.Refresh.isEnabled = true
}
} else {
DispatchQueue.main.async {
self.displayAlert("Unable to Retrieve Latest Conversion Rates", message: "\(error!)")
self.stopActivityIndicator()
self.Refresh.isEnabled = true
}
}
}
// Котировки, отображаемые после нажатия на кнопку USD:
@IBAction func usdConversions(_ sender: Any) {
self.displayAlert("Alert!", message: "USD Selected")
let usdVal = (outputCurrency1.text! as NSString).floatValue
let euroValue = usdVal * (usdtoeurquote["5. Exchange Rate"] as! Float)
outputCurrency2.text = String(format: "%.2f", euroValue)
let gbpVal = usdVal * (usdtogbpquote["5. Exchange Rate"] as! Float)
outputCurrency3.text = String(format: "%.2f", gbpVal)
let cnyVal = usdVal * (usdtocnyquote["5. Exchange Rate"] as! Float)
outputCurrency2.text = String(format: "%.2f", cnyVal)
let cadVal = usdVal * (usdtocadquote["5. Exchange Rate"] as! Float)
outputCurrency2.text = String(format: "%.2f", cadVal)
let inrVal = usdVal * (usdtoinrquote["5. Exchange Rate"] as! Float)
outputCurrency2.text = String(format: "%.2f", inrVal)
let sekVal = usdVal * (usdtosekquote["5. Exchange Rate"] as! Float)
outputCurrency2.text = String(format: "%.2f", sekVal)
let rubVal = usdVal * (usdtorubquote["5. Exchange Rate"] as! Float)
outputCurrency2.text = String(format: "%.2f", rubVal)
let nzdVal = usdVal * (usdtonzdquote["5. Exchange Rate"] as! Float)
outputCurrency2.text = String(format: "%.2f", nzdVal)
}
Необработанные данные JSON: данные JSON на веб-странице
[String:Any]
. Пожалуйста (научитесь) читать JSON. Это очень просто. Например, все в двойных кавычкахString
(без исключений). Таким образом, значение ключа5. Exchange Rate
равноString
, а неFloat
. Далее я рекомендую использовать протоколDecodable
для разбора JSON на структуры. - person vadian   schedule 22.07.2018Double
илиFloat
изString
(но не черезNSString
›floatValue
) - person vadian   schedule 22.07.2018usdConversions
, потому что, как уже упоминалось, ставки являются строками, а не числами с плавающей запятой. Не используйтеNSDictionary
, приведите к[String:Any]
, а значение для ключаRealtime Currency Exchange Rate
на самом деле будет более конкретным[String:String]
. И опустите параметрoptions
..allowFragments
в данном случае бессмысленно. - person vadian   schedule 22.07.2018