如何解决“无法将类型'__NSCFNumber'(0x116e337d8)的值强制转换为'NSDictionary'(0x116e34818)的错误。”

时间:2019-04-17 13:53:47

标签: ios swift firebase firebase-realtime-database

我正在尝试访问嵌套的Firebase数据库,尤其是在自动ID下访问Rating的子级,但是如何正确访问它? JSON结构如下:

users
 Q6jYe9gzAePy8x6SJulTYLMQTpN2
   Fname: Mark Jed
   Lname: Venge
   Rating:
     18e85e0a-9b91-4cb1-a743-792212f1925f
       Rating: 3
       User: k8rn16AAXbTLSyvinD92CugMbL53

这是代码段:

for child in snapshot.childSnapshot(forPath: "Rating").children{

  let child = child as! DataSnapshot

  for ratings in child.children{

    let valueSnap = ratings as! DataSnapshot
    let dict = valueSnap.value! as! [String:Any]

  }

}

问题是“ dict”的错误为

  

无法将类型'__NSCFNumber'(0x116e337d8)的值强制转换为'NSDictionary'(0x116e34818)。

1 个答案:

答案 0 :(得分:0)

您在snapshot.children上有两个嵌套循环,这似乎太多了。

您似乎是从为用户创建快照开始,然后遍历其Rating属性的子级。

for child in snapshot.childSnapshot(forPath: "Rating").children{

因此,在此循环中,child快照是指以下内容:

Rating: 3
User: k8rn16AAXbTLSyvinD92CugMbL53

然后,您再次遍历这些孩子,并尝试将每个孩子读为[String:Any]。这是行不通的,因为这里的每个属性都是一个值。而且由于您无法将3投射到[String:Any],因此应用程序崩溃了。

有两种选择:

  1. 删除内部循环:

    for child in snapshot.childSnapshot(forPath: "Rating").children{
      let child = child as! DataSnapshot
      let dict = child.value! as! [String:Any]
    }
    
  2. 不要强制转换为[String:Any],而只需获取简单的值即可:

    for child in snapshot.childSnapshot(forPath: "Rating").children{
    
      let child = child as! DataSnapshot
    
      for ratings in child.children{
        let valueSnap = ratings as! DataSnapshot
        let value = valueSnap.value! as! Any
      }    
    }
    

修改

为避免“ Any”,以下代码将直接获取每个子节点的等级和用户值。

let ratingsRef = self.ref.child("users").child("the user id")
ratingsRef.observeSingleEvent(of: .value, with: { snapshot in
    let allRatingsSnap = snapshot.childSnapshot(forPath: "Rating")
    for ratingSnap in allRatingsSnap.children.allObjects as! [DataSnapshot] {
        let rating = ratingSnap.childSnapshot(forPath: "Rating").value ?? "no rating"
        let uid = ratingSnap.childSnapshot(forPath: "User").value ?? "no user"
        print("user uid: \(uid)  rating: \(rating)")
    }
})

和输出

user uid: uid_1  rating: 3
user uid: uid_2  rating: 2