无论我多么愚弄它,我似乎无法编译我的代码。我想我需要另一种观点。
在"让图像=数据["图像"]为! [String:AnyObject]"
xcode一直告诉我"不能下标类型' [[String:AnyObject]]'索引类型为' String'"
func retreiveInstagramMedia() {
let token = user?.token
let urlString = "https://api.instagram.com/v1/users/self/media/recent/?access_token=\(token!)"
let url = URL(string: urlString)
URLSession.shared.dataTask(with: url!, completionHandler: {
(data, response, error) in
if(error != nil){
print("error")
}else{
do{
let json = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as! [String : AnyObject]
if let data = json["data"] as? [[String : AnyObject]] {
let image = data["images"] as! [String : AnyObject]
let standardResolution = image["standard_resolution"] as! [String : AnyObject]
let url = standardResolution["url"] as! String
print(url)
}
OperationQueue.main.addOperation({
self.tableView.reloadData()
})
}catch let error as NSError{
print(error)
}
}
}).resume()
}
答案 0 :(得分:1)
首先在Swift 3中,JSON字典为[String:Any]
您的错误(开发人员错误)是使用数组data
作为循环的索引变量。
将下划线替换为anItem
,并使用anItem["images"]
let json = try JSONSerialization.jsonObject(with: data!) as! [String : Any]
if let data = json["data"] as? [[String : Any]] {
for anItem in data {
let image = anItem["images"] as! [String : Any]
let standardResolution = image["standard_resolution"] as! [String : Any]
let url = standardResolution["url"] as! String
print(url)
}
}
注意:键images
表示多个项目,因此值也可以是数组。
答案 1 :(得分:1)
正如马丁所说,你的data
是一系列词典。因此,遍历这些词典:
if let arrayOfData = json["data"] as? [[String : Any]] {
for individualData in arrayOfData {
if let image = individualData["images"] as? [String : Any],
let standardResolution = image["standard_resolution"] as? [String : Any],
let url = standardResolution["url"] as? String {
// now do something with URL
print(url)
}
}
}
我建议你不要使用!
来强制施放/解包。处理来自远程数据源的数据时,您应该更优雅地处理其中一个下标无法检索到您期望的情况。