由于从 api 展开值而崩溃(使用 Alamofire)[重复]

Posted

技术标签:

【中文标题】由于从 api 展开值而崩溃(使用 Alamofire)[重复]【英文标题】:Crash due to unwrapping values from api (using Alamofire) [duplicate] 【发布时间】:2018-04-06 14:33:23 【问题描述】:

我有这个结构来解析我的 api 中的值..

struct Deals 
    let title: String
    let detail: String

init(title : String, detail: String) 
        self.title = title
        self.detail = detail



现在我正在以这种格式解析来自 Alamofire 的数据...

     if httpResponse.statusCode == 200 

            if let result = response.result.value as? [String:Any] 
              guard let top = orderData["data"] as? [Any] else 
                                            return
               
           for value in top 
             let aDict = value as? [String : Any]

             let title = aDict!["title"] as? String

             let detail = aDict!["description"] as? String

              let theDeals = Deals(title: title!, detail: detail!)



但是其中一些值在服务器上的值为 nil(例如,detail 是来自服务器的 nil),因此它会导致崩溃。我很难正确使用if let,以便可以处理崩溃。希望有人能帮忙...

【问题讨论】:

您的应用在哪一行崩溃 在这行let detail = aDict!["... 不要使用展开然后查看@CZ54的答案 您的数据包含 nil 值,但在您使用展开的代码中,这意味着它必须包含值,这就是您的应用崩溃的原因 【参考方案1】:

即使解析失败,您也正在解开 dict。 更新到:

 if httpResponse.statusCode == 200 


      guard let result = response.result.value as? [String:Any],
                let top = orderData["data"] as? [Any]
                else  return 

       for value in top 
        if  let aDict = value as? [String : Any],
            let title = aDict["title"] as? String,
            let detail = aDict["description"] as? String 
                let theDeals = Deals(title: title, detail: detail)
         else 
        //parsing failed
        
       
  

【讨论】:

以上是关于由于从 api 展开值而崩溃(使用 Alamofire)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Tcl C API 的 Lib 可能由于错误的 refCount 使用而崩溃

Android - 由于设置撤销了位置权限导致应用崩溃

从多个自定义 segue 展开到根控制器时崩溃

如何从fetch获取响应值而不是没有值的promise?

由于空值而无法评估绑定时使用默认值

从 JSON 检查空数组