转换为 swift 2.3 后模糊使用“下标”

Posted

技术标签:

【中文标题】转换为 swift 2.3 后模糊使用“下标”【英文标题】:Ambiguous use of 'subscript' after converting to swift 2.3 【发布时间】:2016-09-13 09:32:16 【问题描述】:

我在转换为 swift 2.3 后出现此错误。

guard let json = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? NSDictionary else 
                    throw JSONError.ConversionFailed
                

                guard
                    let loadedWeather = json["weather"]![0]["description"] as? String,
                    let loadedTemperatur = json["main"]!["temp"] as? Float,
                    let loadedWindSpeed = json["wind"]!["speed"] as? Float
                    else 
                        print("Weather JSON-Parsing failed")
                        return
                

Ambiguous use of subscript 错误来自声明“loadedWeather、loadedTemperatur 和 loadedWindSpeed”。

已经尝试将 NSDictionary 更改为 Dictionary 和其他东西,帮助了代码中的另一个位置,但是在这里....

谢谢大家

【问题讨论】:

【参考方案1】:

发生这种情况是因为编译器不知道你的每一行中的中间对象是什么......所以可能是

   if let weather = json["weather"] as? [[String:String]], firstObject = weather.first as? [String:String]
        let loadedWeather = firstObject["description"]
   

   // same for other objects i.e. `json["main"]` and `json["wind"]` with its return type 

【讨论】:

【参考方案2】:

我认为问题在于编译器无法计算出json["weather"] 是什么,您可能需要在代码中更具体。

试试

let loadedWeather = (json["weather"] as! [[String:AnyObject]])[0]["description"] as? String

【讨论】:

谢谢你们!你们俩都解决了我的问题,我决定采用这个解决方案。

以上是关于转换为 swift 2.3 后模糊使用“下标”的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3.0:对成员“下标”问题的模糊引用

不能使用 String 类型的索引为 NSDictionary 类型的值下标。从 Swift 2.3 -> 3.2 转换时

Swift 中下标的模糊使用

对成员“下标”Swift 3 的模糊引用

升级到 Xcode 8 并将语法从 swift 2.3 转换为 swift 3.0 后文件丢失警告

Swift 3 和 Xcode8 - init 的模糊使用