【问题标题】:Initializer for conditional binding must have Optional type, not 'NSDictionary'条件绑定的初始化程序必须具有可选类型,而不是“NSDictionary”
【发布时间】:2016-01-08 15:43:06
【问题描述】:

我不知道我需要一个可选类型是什么意思。我试图做 Do/catch 但它似乎仍然不起作用。

do {
    let json = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers) as! NSDictionary

    if let parseJSON = json {

        let userId = parseJSON["userId"] as? String
        if (userId != nil) {

            NSUserDefaults.standardUserDefaults().setObject(parseJSON["userFirstName"], forKey: "userFirstName")
            NSUserDefaults.standardUserDefaults().setObject(parseJSON["userLastName"], forKey: "userLastName")
            NSUserDefaults.standardUserDefaults().setObject(parseJSON["userId"], forKey: "userId")
            NSUserDefaults.standardUserDefaults().synchronize()

            // take user to a protected page
            /*
            let mainPage = self.storyboard?.instantiateViewControllerWithIdentifier("MainPageViewController") as! MainPageViewController

            let mainPageNav = UINavigationController(rootViewController: mainPage)
            let appDelegate = UIApplication.sharedApplication().delegate

            appDelegate?.window??.rootViewController = mainPageNav
            */

            let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

            appDelegate.buildNavigationDrawer()

        } else {

            // display an alert message
            let userMessage = parseJSON["message"] as? String
            let myAlert = UIAlertController(title: "Alert", message: userMessage, preferredStyle: UIAlertControllerStyle.Alert);
            let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler:nil)
            myAlert.addAction(okAction);
            self.presentViewController(myAlert, animated: true, completion: nil)
        }

    }
} catch {
   print(error)
}

【问题讨论】:

    标签: ios json swift swift2 ios9


    【解决方案1】:

    有了这条线,使用as!:

    let json = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers) as! NSDictionary
    

    您将 NSJSONSerialization 的结果强制转换为 NSDictionary。

    因此生成的json 不是可选的:您不必用if let 解包。

    去掉if let parseJSON = json { }部分,直接使用json

    let userId = json["userId"] as? String
    

    等等

    或者如果你想保持结果为可选,你可以使用as?:

    if let json = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers) as? NSDictionary {
        let userId = json["userId"] as? String
        // etc
    }
    

    【讨论】:

    • 太棒了,谢谢!但问题是,我是否仍应将 ' let userId = parseJSON["userId"] 替换为? String' 到 'let userId = json["userId"] as?字符串'
    • 来吧,如果你按照代码的逻辑你会自己找到答案。 :) 如果您迷路了,我会发布一个示例,但真的请尝试一下,适应一下,您会发现它并不复杂。
    • 我运行了它,它没有向数据库发送任何东西,我单步执行它,它在这段代码上失败了你知道它还有什么可能吗?
    猜你喜欢
    • 2019-03-11
    • 2017-01-22
    • 2018-03-25
    • 2017-04-08
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    相关资源
    最近更新 更多