Alamofire 在展开 Optional 时意外发现 nil,但我可以看到 JSON

Posted

技术标签:

【中文标题】Alamofire 在展开 Optional 时意外发现 nil,但我可以看到 JSON【英文标题】:Alamofire unexpectedly found nil while unwrapping an Optional, yet I can see the JSON 【发布时间】:2016-06-21 14:04:53 【问题描述】:

使用 AlamoFire,我可以对我的端点进行 API 调用,它可以正常工作并按预期连接。使用打印工具,我可以将 JSON 响应打印到控制台并查看 JSON 字符串,但我无法让该字符串移动到下一个函数。

我不断收到错误:

"fatal error: unexpectedly found nil while unwrapping an Optional value (lldb)"

我的代码如下所示:

func getDataForUser(Username:String, UserToken:String) 
    print("Getting data for user \(Username)")
    Alamofire.request(.POST, baseURL+userdataURL, parameters: ["Username": Username, "UserToken": UserToken]).response  (req, res, data, error) -> Void in
        let jSONResponse: NSDictionary = (try! NSJSONSerialization.JSONObjectWithData(data!,options: NSJSONReadingOptions.MutableContainers)) as! NSDictionary
        print(jSONResponse)
        if(jSONResponse["Success"] as! Bool == true) 
            print("Success! API Request Worked")
            self.delegate!.didReceiveAPIResults(jSONResponse)
        
     

错误在线:

self.delegate!.didReceiveAPIResults(jSONResponse)

控制台如下所示:

jSONResponse    NSDictionary    2 key/value pairs   0x78e8d6a0
[0] (null)  "Success" : "1" 
[1] (null)  "Response" : 2 key/value pairs  

jSONResponse 的调试屏幕为我提供了可以深入研究的数据,因此我知道它不是零。 nil 来自哪里,我该如何解决?

【问题讨论】:

崩溃在哪一行? self.delegate!.didReceiveAPIResults(jSONResponse) 那么很简单:你的代表是零。 那是什么意思?我认为委托是由 jSONResponse 填充的? @EricD 这就是我的想法。什么类符合委托?你能告诉我们这是在哪里发生的吗? 【参考方案1】:

在 Swift 中,"1" 不等于 Bool 的值 true

它在jSONResponse["Success"] as! Bool == true 崩溃。您可以将其更改为 jSONResponse["Success"] as! String == "1"

如果您能够修改正在使用的 API 的源代码,您最好将 Success 设为 true/false JSON 布尔值,并保持 Swift 代码不变。

【讨论】:

它无关紧要,即使代码只是: print(jSONResponse) self.delegate!.didReceiveAPIResults(jSONResponse) 它仍然在 self.delegate!.didReceiveAPIResults(jSONResponse) 上失败 感谢您编辑您的问题。这表明delegatenil 不是吗?【参考方案2】:

我最初的想法是 JSON 处理程序或 API 控制器是错误的。 我没有通过的是视图控制器设置中的委托变量。 例如:

api.delegate = self

感谢@paulvs 和 Eric D 指出这一点。

【讨论】:

以上是关于Alamofire 在展开 Optional 时意外发现 nil,但我可以看到 JSON的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 打印“可选(数据)”,我怎样才能摆脱“可选”

Alamofire:在展开可选值时意外发现 nil

Alamofire.AFError.responseValidationFailed

在 Swift 中播放音乐:在展开 Optional 值时意外发现 nil

Swift3,展开 Optional<Binding>(在 SQLite.swift 中)

Alamofire 平面错误:在展开可选值时意外发现 nil