【问题标题】:Could not cast value of type '__NSCFString' to 'NSDictionary' switft 5无法将 '__NSCFString' 类型的值转换为 'NSDictionary' switft 5
【发布时间】:2020-08-23 23:25:30
【问题描述】:

我想从 Firebase 数据库中获取用户列表并将其放入 Users 数组中,但我无法从快照中获取数据

这是我尝试过的

class User: NSObject {
    var name: String?
    var email: String?
}

 var users : [User] = []

  func fetchUsers() {
        Database.database().reference().child("users").observe(.childAdded) { (snapshot) in
            for child in (snapshot.children) {
                let snap = child as! DataSnapshot
                let dic = snap.value as! [String: String] // erros here
                //print((dic["name"]))

                //WANT TO LOAD THE LIST OF USERS INTO `var users`
            }
        }
    }

错误 Could not cast value of type '__NSCFString' to 'NSDictionary'

这就是我的数据在 firebase 数据库中的样子

感谢您的帮助 回复

【问题讨论】:

  • 请先打印 child ...然后告诉我你得到了什么
  • 嗨 Jawed 感谢您的回复,我打印了孩子,这就是我得到的 Snap(电子邮件) Sairam11@gmail.com Snap(姓名) Sairam11 Snap(电子邮件) Sairam2@gmail.com Snap(姓名) Sairam 2 快照(电子邮件) Sairam3@gmail.com 快照(名称) Sairam3 快照(电子邮件) Sairam1@gmail.com 快照(名称) Sairam
  • 什么是 DataSnapshot ?你在其中强行施放它?
  • 说实话,我很漂亮。 swift和ios的新手,所以我还在学习,如果不需要DataSnapshot。那你能告诉我怎么做吗
  • 删除这一行...let snap = child as! DataSnapshot

标签: swift xcode firebase-realtime-database swift5


【解决方案1】:
func fetchUsers() {
        Database.database().reference().child("users").observe(.childAdded) { (snapshot) in
            for child in snapshot.children.allObjects as! [DataSnapshot] {
                print(child.value)

               if let dict = child.value as? [String : AnyObject] {
                if let email = dict["email"] {
                      print(email)

                  }

            }
        }
    }
 }

【讨论】:

  • 让我知道它是否有效......如果不是......那么错误和......print(child.value)这个打印语句结果
  • 嗨,我得到child.valueOptinonal (Sairam11@gmail.com) 等等,对于print(dict["name"]),我得到nil 这是完整的输出Optional(Sairam11@gmail.com) nil Optional(Sairam11) nil Optional(Sairam2@gmail.com) nil Optional(Sairam 2) nil Optional(Sairam3@gmail.com) nil Optional(Sairam3) nil Optional(Sairam1@gmail.com) nil Optional(Sairam) nil
  • 现在看看兄弟
  • 你好兄弟,我试过了,我在let - Initializer for conditional binding must have Optional type, not '[String : AnyObject]'得到这个错误
  • 对不起..我的错
【解决方案2】:

这是因为DataSnapshot 是一个StringObject 的字典。这应该可以解决问题

guard let dict = child.value as? [String : AnyObject] 
else { 
   print("couldn't cast to dictionary")
   return 
}
print("successfully cast to dictionary")
print(dict["name"])
print(dict["email"])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-01
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    • 2020-03-26
    • 2018-02-08
    相关资源
    最近更新 更多