【发布时间】:2017-03-17 01:23:50
【问题描述】:
我不确定我在哪里做错了。
let recievedJson = json
let results = recievedJson["results"] as! NSArray
let resultsDic = results[0] as! NSDictionary
let address = resultsDic["address_components"] as? NSArray
let zipcodeDic = address?[0] as! NSDictionary
let cityNameDic = address?[1] as! NSDictionary
let countyDic = address?[2] as! NSDictionary
let stateDic = address?[3] as! NSDictionary
let countryDic = address?[4] as! NSDictionary
let zipcode = zipcodeDic["long_name"] as! String
let cityName = cityNameDic["long_name"] as! String
let countyName = countyDic["long_name"] as! String
let stateName = stateDic["long_name"] as! String
let stateShortName = stateDic["short_name"] as! String
let countryName = countryDic["long_name"] as! String
let countryShortName = countryDic["short_name"] as! String
试图从这个 json 响应中检索数据
http://maps.googleapis.com/maps/api/geocode/json?address=23508&sensor=true
这对我有用,对@Danh 答案的小改动。
let recievedJson: [String: Any] = json as! [String : Any]
if let results = recievedJson["results"] as? [[String: Any]] {
if results.count > 0 {
let resultsDic = results[0]
if let address = resultsDic["address_components"] as? [[String: Any]] {
for dict in address {
if let longName = dict["long_name"] as? String,
let shortName = dict["short_name"] as? String,
let types = dict["types"] as? [String] {
if types.contains("postal_code") {
print("postal_code: \(longName)")
} else if types.contains("locality") {
print("city: \(longName)")
} else if types.contains("administrative_area_level_2") {
print("county: \(longName)")
} else if types.contains("administrative_area_level_1") {
print("state: \(longName)")
} else if types.contains("country") {
print("country: \(longName)")
}
}
}
}
}
}
【问题讨论】:
-
做出这样的假设绝不是一个好主意。防守代码。摆脱所有
as!并使用if let ... as? ...。在尝试访问特定索引之前检查数组计数。 -
而且由于您使用的是 Swift,请避免使用
NSDictionary和NSArray。使用具有正确类型信息的 Swift 字典和 Swift 数组。 -
@rmaddy 如果我不使用 NSArray/NSDictionary,xcode 会显示错误“对成员 'subscript' 的模糊引用”
-
@Karen 使用新代码编辑您的问题。