Ваш код загружает один конкретный c дочерний узел. Если вы хотите просуммировать все дочерние узлы, вы должны загрузить их все:
ref.child("Value").observeSingleEvent(of: .value) { (snapshot) in
...
Поскольку вы храните значения numeri c в виде строк в базе данных, вам нужно будет снова преобразовать их в числа в вашем коде.
let price = Double(data!["Price"] as? String ?? "0")
Остальная часть вашего кода кажется правильной для этого случая, насколько я могу видеть.
Начиная с
Немного более идиоматическая c версия этого кода будет выглядеть так:
ref.child("Value").observeSingleEvent(of: .value) { (snapshot) in
var sum: Double = 0
for snap in snapshot.children.allObjects as! [DataSnapshot] {
let price = snap.childSnapshot(forPath: "Price").value as! String
sum += Double(price)
}
print("Final sum: \(sum)")
}
Что здесь отличается:
- Выполните жесткое приведение к
[DataSnapshot]
только один раз . - Используйте
childSnapshot(forPath:)
для поиска свойства Price
. - Жесткое преобразование значения в
String
, так как свойство всегда существует в ваших данных и сохраняется как строка. - Преобразование строкового значения из базы данных в двойное, чтобы иметь возможность его суммировать.