Как я могу исправить эту ошибку «Не удалось преобразовать значение типа« __NSCFNumber »(0x116e337d8) в« NSDictionary »(0x116e34818).» - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь получить доступ к вложенной базе данных Firebase, в частности к дочернему элементу 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 голосов
/ 17 апреля 2019

У вас есть два вложенных цикла над 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...