今天我遇到了一个问题,由于某种原因,url不想读取链接。我不知道如何解决这个问题。我在这里写的所有内容:由于某种原因,url = URL (string: "here")
没有转换为链接。据我所知,我到处都有nil
,因为我甚至不去let task = URLSession.shared.dataTask (with: url!)
,因为url没有从字符串转换为URL
。
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
// po searchBar.text
// print object
let urlString = "http://api.weatherstack.com/current?access_key=617ce097a4c8352ad4fa7b34e2570aa8&query=(searchBar.text!)"
let url = URL(string: urlString)
var locationName: String?
var temperature: Double?
let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
do {
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! [String : AnyObject]
if let location = json["location"] {
locationName = location["name"] as? String
}
if let current = json["current"] {
temperature = current["temperature"] as? Double
}
}
catch let jsonError {
print(jsonError)
}
}
task.resume()
}
您永远不应该强制打开从来自用户输入的动态String
创建的URL
。您应该可选地绑定URL(string:)
的返回值,并对搜索栏输入进行百分比编码,以确保URL字符串有效。
let urlString = "http://api.weatherstack.com/current?access_key=617ce097a4c8352ad4fa7b34e2570aa8&query=(searchBar.text!)"
guard let encodedUrlString = urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed),
let url = URL(string: encodedUrlString) else {
// You could display an error message to the user from here
return
}
与您的问题无关,但您不应该使用JSONSerialization
来解码JSON响应。请改用Codable
。