Ios 无法强制展开非可选类型的值';任何对象';

Ios 无法强制展开非可选类型的值';任何对象';,ios,swift,swift3,xcode9,Ios,Swift,Swift3,Xcode9,我已将iOS项目从swift 2.x转换为swift 3.x 现在我的代码中有50多个错误。最常见的一种是“无法强制展开非可选类型‘AnyObject’的值” 以下是代码的一部分: 行let documentURL=JSON[eachOne][“media”]!![每个媒体][“媒体url”]正在生成错误 我如何解决这个问题?谢谢大家! if let JSON = response.result.value as? [[String: AnyObject]]{ //print("JSON

我已将iOS项目从swift 2.x转换为swift 3.x 现在我的代码中有50多个错误。最常见的一种是“无法强制展开非可选类型‘AnyObject’的值”

以下是代码的一部分:

let documentURL=JSON[eachOne][“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
                    })
                }
            }
        }
    }
}
如果让JSON=response.result.value为?[[String:AnyObject]]{
//打印(“JSON:\(JSON)”)
myDefaultValues.userDefaults.setValue(JSON,forKey:“JSON”)
对于0..<(JSON作为任何对象)。计数{
//打印(“封面:\(JSON[eachOne][“封面”]))
//下载所有封面
让documentURL=JSON[eachOne][“cover”]!
让pathus=URL(字符串:documentURL为!字符串)
如果pathus!=零{
HttpDownloader.loadFileSync(pathus!,完成:{(路径:String,错误:NSError!)在中
})
}
//下载所有媒体文件
如果JSON[eachOne][“媒体”!=nil{
//打印(JSON[eachOne][“媒体”!)
//打印(JSON[eachOne][“媒体”]!!.count)
让thisMediaView=JSON[eachOne][“media”]!计数
对于0..
首先,代码中的以下行生成Int,而不是数组:

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
}

作为一个初学Swift的程序员,你应该假装
强制展开操作符不存在。我称之为“零时崩溃”操作符。相反,您应该使用
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 {
     }
   }
}

这段代码可能并不完美,但它应该给你一个想法。

你不应该再使用任何对象了,请使用“Any?”在中分别定义它们:数组、字符串、字典(让documentURL=JSON[eachOne][“media”]..)我尝试过使用“Any”,但它会产生相同的结果error@MAhipalSingh你能给我举个例子吗?让JSON=JSON为!字典让dic1=JSON[“eachOne”]as!Dictionary让arrMedia=object[“media”]as!像这样的东西嗨,邓肯,谢谢。我正在尝试实现你的代码,请看这个!好吧,好好想想。编译器不知道数组中的对象是字典,因此必须向guard语句添加子句才能将其转换为正确的类型。我将编辑我的答案以添加适当的代码。(不要张贴代码的图片。这很难使用。)谢谢邓肯C,它现在似乎起作用了:)谢谢!不客气,但不要只是复制/粘贴我给你的代码而不理解它。阅读选项、展开、保护声明、如果让
选择绑定等。这些都是学习Swift的中心主题,你越早熟悉它们,你的生活就会越好。