尝试访问字典时出现Swift错误:“找不到成员”下标“

这不会编译:

我尝试了几件不同的事情;不同的声明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
}

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...