首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >词典的快速选择词

词典的快速选择词
EN

Stack Overflow用户
提问于 2016-03-29 14:34:00
回答 2查看 43关注 0票数 3
代码语言:javascript
复制
MFSAPIManager().registerNewUser(userFirstName!, lastName: userLastName!, userTypeId: 1, email: userEmail!, password: userPassword!, completionHandler: { (response) in

        guard response.error == nil else {
            if let error = response.error {
                print(error)
            }
            dispatch_async(GlobalMainQueue) {
                self.displayAlertViewController(title: "Error", message: "Der Benutzer konnte nicht registriert werden")
            }
            return
        }

        if let serverResponse = response.value as? Dictionary<String,AnyObject> {
            let newUserReference = serverResponse["data"]!["userReference"]

            if (newUserReference != nil) {
                self.currentPLISTData["userReference"] = newUserReference
                dispatch_async(GlobalMainQueue) {
                    var myAlert = UIAlertController(title: "Alert", message: "Registrierung erfolgreich", preferredStyle: UIAlertControllerStyle.Alert)
                    let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: { (action) in
                        self.dismissViewControllerAnimated(true, completion: nil)
                    })
                    myAlert.addAction(okAction)
                    self.presentViewController(myAlert, animated: true, completion: nil)
                }
            }
        }


    })

我收到一条需要更改的错误消息:

代码语言:javascript
复制
let newUserReference = serverResponse["data"]["userReference"]

代码语言:javascript
复制
let newUserReference = serverResponse["data"]!["userReference"]

因此,展开["data"]组件。我搞不懂为什么会这样?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-29 14:48:54

快速字典 an 返回一个可选的.

这意味着要能够使用serverResponse["data"]订阅["userReference"],首先必须打开serverResponse["data"]

它可以不安全地完成,比如在您的示例中,或者安全地使用类似于if let的东西。

代码语言:javascript
复制
if let data = serverResponse["data"] {
    let newUserReference = data["userReference"]
}

还请注意,编译器现在可能不是serverResponse["data"]的类型,因此您可能不得不降低它的类型,以便能够订阅它,例如:

代码语言:javascript
复制
if let data = serverResponse["data"] as? [String:AnyObject] {
    let newUserReference = data["userReference"]
}
票数 4
EN

Stack Overflow用户

发布于 2016-03-29 14:51:10

通过下标访问Dictionary<Key,Value>将返回一个Value?。这是因为您正在寻找的键值对可能不在字典中。因此,它返回一个可选选项,如果它找到键,则返回set;如果没有,则返回unset。

我会这样处理它,使用可选的链接:

代码语言:javascript
复制
if let serverResponse = response.value as? Dictionary<String,AnyObject>,
       newUserReference = serverResponse["data"]?["userReference"] {
  ...
}

通过将所有if..let语句组合成一个,可以减少“厄运金字塔”

Eric D提出了一个很好的观点,您应该测试第一个下标的类型,我会这样做:

代码语言:javascript
复制
if let serverResponse = response.value as? Dictionary<String,AnyObject>,
       data = serverResponse["data"] as? [String:AnyObject],
       newUserReference = data["userReference"] {
  ...
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36287373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档