无法将'[String]'类型的值转换为预期的参数类型'String'

时间:2017-11-13 19:51:52

标签: swift dictionary

我有一个数组(来自全局常量文件),我试图在API调用中使用它来创建另一个字典数组。最初的数组是:

let callCountries = ["AU" : "Australia", "NZ" : "New Zealand", "UK" : "United Kingdom", "ZA" : "South Africa", "US" : "United States"]

然后我想抓住国家的短代码并循环通过它来构建一个新的数组,如下所示......

func getCallCentreNumbers(){

    var countrykeys = Array(callCountries.keys)

    API.getJudeContactNumbers({response in

            self.judeCallCentreNumberDict =  [
                countrykeys : (response.value(forKey: countrykeys) as! String),
        ]

    })

}

没有插入数组值的初始代码行是:

self.judeCallCentreNumberDict =  [
                "ZM" : (response.value(forKey: "ZM") as! String),
        ]

我想用countrykeys变量替换“ZM”,但是无法使用这个变量。 (对不起,我还是个新手)。有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

我建议循环回复

首先尝试在发出请求之前清除judeCallCentreNumberDict

judeCallCentreNumberDict = [:]

然后,当你有响应时,创建一个键数组并循环它

(在API.getJudeContactNumbers({response in内)

let countrykeys = callCountries.map { $0.key }

countrykeys.forEach {
    guard let value = response.value(forKey: $0) as? String else { return }
    judeCallCentreNumberDict[$0] = value
}

注意:

  • $0表示循环中的当前项(在这种情况下,它将是其中一个键)
  • 我猜测judeCallCentreNumberDict属于[String:String]类型,因此我们只能添加String类型而非String?的值,这就是guard {1}}适用于

答案 1 :(得分:0)

看起来您想要查看响应中的每个数字,并为每个国家/地区代码构建一个数字字典。您接近此实现,但您需要迭代countrykeys中的密钥,查看每个密钥的值,并将该值分配给judeCallCentreNumberDict中的相应国家/地区代码。

func getCallCentreNumbers() {
    var countrykeys = Array(callCountries.keys)

    API.getJudeContactNumbers { response in
        for countryKey in countryKeys {
            let number = (response.value(forKey: countrykeys) as! String)
            self.judeCallCentreNumberDict[countryKey] = number
        }
    }
}

上面的代码将解决编译器问题,但似乎这个代码对于你想要做的事情是不必要的(至少在给定的上下文中)。如果您只想进行API调用并获取联系号码字典,那么似乎API正在为您充分处理。似乎API已经为您返回了电话号码字典。所以代码可以缩减为类似下面的代码。 (除非响应返回JSON,否则这些实现将失败)

func getCallCentreNumbers() {   
    API.getJudeContactNumbers { response in
        self.judeCallCentreNumberDict = response
    }
}