我已将我的iOS项目从swift 2.x转换为swift 3.x. 现在我的代码中有50多个错误。其中最常见的是这一个“不能强制解包非可选类型'AnyObject'的值”
以下是代码的一部分:
行let documentURL = JSON[eachOne]["media"]!![eachMedia]["media_url"]!
正在产生错误
如何解决此问题?谢谢!
if let JSON = response.result.value as? [[String: AnyObject]]{
//print("JSON: \(JSON)")
myDefaultValues.userDefaults.setValue(JSON, forKey: "JSON")
for eachOne in 0 ..< (JSON as AnyObject).count{
// print("Cover: \(JSON[eachOne]["cover"])")
//Download all Covers
let documentURL = JSON[eachOne]["cover"]!
let pathus = URL(string: documentURL as! String)
if pathus != nil {
HttpDownloader.loadFileSync(pathus!, completion:{(path:String, error:NSError!) in
})
}
//Download all Media Files
if JSON[eachOne]["media"] != nil{
//print(JSON[eachOne]["media"]!)
//print(JSON[eachOne]["media"]!!.count)
let thisMediaView = JSON[eachOne]["media"]!.count
for eachMedia in 0 ..< thisMediaView!{
//print(JSON[eachOne]["media"]!![eachMedia]["media_url"])
**let documentURL = JSON[eachOne]["media"]!![eachMedia]["media_url"]!**
let pathus = URL(string: documentURL as! String)
if pathus != nil {
HttpDownloader.loadFileSync(pathus!, completion:{(path:String, error:NSError!) in
})
}
}
}
}
}
答案 0 :(得分:2)
作为Swift程序员的开始,您应该假装!
强制解包运算符不存在。如果没有&#34;我称之为&#34;崩溃运营商。相反,您应该使用if let
或guard let
可选绑定。您将JSON对象转换为字典数组,因此请直接使用该数组:
for anObject in JSON {
guard let mediaArray = anObject["media"] as [[String: Any]] else
{
return
}
for aMediaObject in mediaArray {
guard let aMediaDict = aMediaObject as? [String: Any],
let documentURLString = aMediaDict["media_url"] as? String,
let url = URL(string: documentURLString ) else
{
return
}
//The code below is extracted from your question. It has multiple
//issues, like using force-unwrap, and the fact that it appears to be
//a synchronous network call?
HttpDownloader.loadFileSync(pathus!,
completion:{(path:String, error:NSError!) in {
}
}
}
这段代码可能不完美,但它可以给你一个想法。
答案 1 :(得分:0)
首先,代码中的以下行生成Int,而不是Array:
let thisMediaView = JSON[eachOne]["media"]!.count
其次,您可以强制解开所有值,但这会带来很大的风险。你不应该强行打开,除非......不要等待,只是不要强行打开。
这里的行对JSON中的值类型做了很多假设,而没有实际检查。
let documentURL = JSON[eachOne]["media"]!![eachMedia]["media_url"]!
为了更加安全和富有表现力,请尝试按如下方式编写:
if let value = JSON[eachOne] as? [String: Any],
let anotherValue = JSON[value] as? [String: Any],
...etc,
let documentURL = anotherValue["media_url"] as? String {
// do something with the values
} else {
// handle unexpected value or ignore
}