这不会编译:
我尝试了几件不同的事情;不同的声明Dictionary的方法,改变它的类型以匹配数据的嵌套.我也试图明确地说我的“任何”是一个集合,所以它可以被下标.没有骰子.
- import UIKit
- import Foundation
- class CurrencyManager {
- var response = Dictionary<String,Any>()
- var symbols = []
- struct Static {
- static var token : dispatch_once_t = 0
- static var instance : CurrencyManager?
- }
- class var shared: CurrencyManager {
- dispatch_once(&Static.token) { Static.instance = CurrencyManager() }
- return Static.instance!
- }
- init(){
- assert(Static.instance == nil,"Singleton already initialized!")
- getRates()
- }
- func defaultCurrency() -> String {
- let countryCode = NSLocale.currentLocale().objectForKey(NSLocaleCountryCode) as String
- let codesToCountries :Dictionary = [ "US":"USD" ]
- if let localCurrency = codesToCountries[countryCode]{
- return localCurrency
- }
- return "USD"
- }
- func updateBadgeCurrency() {
- let chanCurr = defaultCurrency()
- var currVal :Float = valueForCurrency(chanCurr,exchange: "Coinbase")!
- UIApplication.sharedApplication().applicationIconBadgeNumber = Int(currVal)
- }
- func getRates() {
- //Network code here
- valueForCurrency("",exchange: "")
- }
- func valueForCurrency(currency :String,exchange :String) -> Float? {
- return response["current_rates"][exchange][currency] as Float
- }
- }
我们来看看
- response["current_rates"][exchange][currency]
响应声明为Dictionary< String,Any>(),所以在第一个下标之后,您尝试在类型为Any的对象上调用另外两个下标.
解决方案1.将响应类型更改为嵌套字典.请注意,我添加了问号,因为任何时候您访问一个字典项,您可以返回一个可选项.
- var response = Dictionary<String,Dictionary<String,Float>>>()
- func valueForCurrency(currency :String,exchange :String) -> Float? {
- return response["current_rates"]?[exchange]?[currency]
- }
解决方案2.解析时将每个级别转换为字典.确保仍然检查是否存在可选值.
- var response = Dictionary<String,Any>()
- func valueForCurrency(currency :String,exchange :String) -> Float? {
- let exchanges = response["current_rates"] as? Dictionary<String,Any>
- let currencies = exchanges?[exchange] as? Dictionary<String,Any>
- return currencies?[currency] as? Float
- }