代码之家  ›  专栏  ›  技术社区  ›  casillas

拆解-可选值[重复]时意外发现nil

  •  -3
  • casillas  · 技术社区  · 6 年前

    可选值

    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 回复  |  直到 6 年前
        1
  •  2
  •   Christian Abella    6 年前

    我尝试过您的代码,但不确定您在哪里声明pageproducts,但如果您想检查HTTP调用的状态代码,则需要检查响应变量并将其强制转换为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()
      }