在打开一个 - 可选值时,意外地发现了nil

时间:2018-06-19 02:08:13

标签: ios json swift

我有以下实施方案;但是,我收到以下错误。

  

线程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()
}

1 个答案:

答案 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()
  }