【问题标题】:Could not cast value of type 'NSTaggedPointerString' to 'NSDictionary'. Swift/Firebase无法将“NSTaggedPointerString”类型的值转换为“NSDictionary”。斯威夫特/火力基地
【发布时间】:2017-04-15 05:17:12
【问题描述】:

在 Firebase 中侦听新对象时,我收到此错误:无法将 NSTaggedPointerString 类型的值转换为 NSDictionary。这是监听已注册用户的代码。

FIRAuth.auth()!.addStateDidChangeListener { auth, user in
     guard let user = user else { return }
     self.user = User(authData: user)

     let userref = FIRDatabase.database().reference(withPath: "users").child(self.user.uid)
     userref.observe(.value, with: { snapshot in
          print(snapshot.value!)
          var newItems: [UserItem] = []
          for item in snapshot.children {
               let userDetail = UserItem(snapshot: item as! FIRDataSnapshot) /////////// CRASHES HERE //////////
               newItems.append(userDetail)
          }
     self.userItem = newItems
     })
     print(self.user.uid)
}

当错误出现时,它指向这里:

    init(snapshot: FIRDataSnapshot) {
        key = snapshot.key
        let snapshotValue = snapshot.value as! [String:Any] ///// ERROR HERE
        name = snapshotValue["name"] as! String
        email = snapshotValue["email"] as! String
        age = snapshotValue["age"] as! String
        ref = snapshot.ref
}

控制台正在正确打印 Firebase 内部的内容,并且数据在那里并且存在,但是这种转换或数据读取错误不断发生。它与转换有关,但我不确定。

【问题讨论】:

  • 错误信息说snapshot.value不是Dictionary,而是String
  • 所以我应该写,让snapshotValue = snapshot.value as! [字典:任何]?
  • 因为我试过这个,让 snapshotValue = (snapshot.value as Disctionary) as! [String:Any] 但这不起作用
  • as! [Dictionary:Any]?仍然更糟,更糟。
  • 也试过这个,if let dictionary = snapshot.value as? NSDictionary { if let username = dictionary["name"] as?字符串 { 打印(用户名)}

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

snapshot.value as! String

在这种情况下,值是一个字符串,所以这是你必须转换的。

【讨论】:

  • 然后必须删除其他行。
  • 但后来我明白了,不能用“字符串”类型的索引为其他项目(姓名、年龄、电子邮件)下标“字符串”类型的值
  • 你看我的评论了吗?您需要删除有关其他项目的行。没有其他项目。该值不是字典。它是一个字符串!你需要被告知多少次?
  • 我做了,但是,项目的设置方式,我需要它是一个字典,所以我可以单独访问这些值。像这样,让 detail = UserItem[indexPath.row] print(detail.name) etc.
  • 错误告诉你它不是字典。那是现实。你不能让它成为一本字典。这是一个字符串。这是你被告知的四次。
【解决方案2】:

可能是您更新了数据库而旧数据的格式不正确,请尝试删除数据库,添加新数据并再次运行程序

【讨论】:

    猜你喜欢
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 2017-02-02
    相关资源
    最近更新 更多