我有以下方法可以很好地解析来自开源端点的基本 json 数据。我的问题是,在更正编译错误时,我需要帮助理解以下行:
let movieDictionary = json??["Search"] as! [[String:Any]]
为什么我需要有'??' ?我想我需要'?或“!”,但为什么是“??”?如果我删除其中一个“?”或替换 '??'带有“!”,Xcode 坚持要我添加另一个“?”,然后我的代码编译。
我的完整方法如下:
func fetchMovies() {
let url = NSURL(string: "http://www.omdbapi.com/?s=batman")
URLSession.shared.dataTask(with: url! as URL) { (data, response, error) in
if error != nil {
print(error)
return
}
do {
let json = try? JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? [String:Any]
let movieDictionary = json??["Search"] as! [[String:Any]]
for movie in movieDictionary {
print(movie["Title"]!)
}
} catch let jsonError {
print(jsonError)
}
}.resume()
}
最佳答案
第一个?
来自try?
.当出现可抛出函数时,您有 3 种选择来编写它:
-
try
: 如果函数失败,请转到catch
阻止 -
try?
: 如果函数失败,返回nil
不要去catch
堵塞。因此,返回类型是Optional<T>
-
try!
: 如果函数失败,使应用程序崩溃
第二个?
来自 Actor :as? [String:Any]
.您要求编译器将其转换为 [String: Any]
并返回 nil
如果它不可类型转换。
如果你想摆脱它们:
let url = NSURL(string: "http://www.omdbapi.com/?s=batman")
URLSession.shared.dataTask(with: url! as URL) { (data, response, error) in
guard error == nil else {
print(error!)
return
}
do {
guard let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? [String:Any] else {
print("Unexpected JSON format")
return
}
let movieDictionary = json["Search"] as! [[String:Any]]
for movie in movieDictionary {
print(movie["Title"]!)
}
} catch let jsonError {
print(jsonError)
}
}.resume()
关于ios - 需要解释一下 Swift 代码中的 JSON 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43444499/