我有以下实施方案;但是,我收到以下错误。
线程5:致命错误:在展开时出乎意料地发现了nil 可选值
struct StoreProducts: Decodable {
let totalProducts: Int?
let pageNumber: Int?
}
var products: StoreProducts!
override func viewDidLoad() {
super.viewDidLoad()
fetchProducts(completion: { success in
print(self.products as Any)
self.products = products
self.productTableView.reloadData()
})
}
func fetchProducts(completion: @escaping ((Any) -> Void)) {
let jsonUrlString = "https://mobile-server.com/products/1/20"
guard let url = URL(string: jsonUrlString) else { return }
// Note: Swift 4 JSONCoder()
URLSession.shared.dataTask(with: url) { (data, response, err) in
guard let data = data else { return }
do {
// getting error here
self.products = try JSONDecoder().decode(StoreProducts.self, from: data)
//check response status 200 OK
if pageProducts.statusCode != 200
{
print("Connection issue, please try again later")
}
else{
completion(self.products as Any)
}
}
//check error
catch let jsonErr {
print("Error serializing json:", jsonErr)
}
}.resume()
}
答案 0 :(得分:2)
我尝试了你的代码并且不确定你在哪里声明了pageProducts,但是如果要检查HTTP调用的statusCode,你需要检查响应变量并将其转换为HTTPURLReponse。
fetchProducts(completion: { success in
if let products = success as? StoreProducts
{
print(products.totalProducts!)
print(products.pageNumber!)
}
})
func fetchProducts(completion: @escaping ((AnyObject) -> Void)) {
let jsonUrlString = "https://mobile-tha-server.appspot.com/walmartproducts/1/20"
guard let url = URL(string: jsonUrlString) else { return }
// Note: Swift 4 JSONCoder()
URLSession.shared.dataTask(with: url)
{ (data, response, err) in
guard let data = data else { return }
do {
// getting error here
self.products = try JSONDecoder().decode(StoreProducts.self, from: data)
//check response status 200 OK
if let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode != 200 {
print("Connection issue, please try again later")
}
else{
completion(self.products as AnyObject)
}
}
//check error
catch let jsonErr {
print("Error serializing json:", jsonErr)
}
}.resume()
}