arrays - 将 firebase 中多个字典中的值添加到 Int 中

标签 arrays swift firebase dictionary firebase-realtime-database

我使用 Firebase 来存储应用中每个视频的观看次数。我想要的是收集一个用户所有视频的所有观看次数并显示观看总数。但是,我在获取数据并将所有字典值放入 Int/String 中时遇到问题!

到目前为止,我已经尝试了许多不同的解决方案,但我仍然得到了字典中的数组/值等所有不同的值,而不是添加到一个值中的所有值

这是我用于获取特定用户的所有视频 View 的代码,到目前为止没有问题。当我打印“intConvert”时,我得到了不同行中的所有 View 。

<小时/>
      let ref = Database.database().reference().child("videoviews").child(stringUid)
    ref.observe(.value, with: { (snapshot) in
        if let dictionary = snapshot.value as? [String: AnyObject]{

            let numbOfViews = dictionary["views"] as! String
            let intConvert = Int(numbOfViews)!
            let ArrayViews = [intConvert]
<小时/>

这是我的数据库结构:

   **videoviews**
        -Lb52VxrEqdSRGljJdP7
                          views: "25"

        -Lb53ARq_lOHEbTruW8s
                          views: "273"

        -Lb53A_cEyX3CYc4mKYn
                          views: "38"
<小时/>

编辑:如果我执行 print(dictionary),则“if letdictionary = snapshot.value as? [String: Anyobject] 中的字典如下所示:

      ["views": 642]
      ["views": 660]
      ["views": 628]
      ["views": 630]
      ["views": 615]
      ["views": 3]
      ["views": 0]
      ["views": 2]
      ["views": 1]
<小时/>

编辑:(我很困惑,忘记添加手镯,对此感到抱歉。) 当我这样做时,我“打印(dictionary.values)控制台看起来像这样(来自不同字典的键值):

  [642]
  [660]
  [628]
  [630]
  [615]
   [3]
   [0]
   [2]
   [1]

然后我尝试将其放在一个循环中,如下所示:

<小时/>
       var bLoader = 0.0
            for hejArray in 0...ArreyViews.count-1{
                bLoader += Double(Arrej[hejArray])
            }
<小时/>

但是当我打印“bLoader”时,我仍然获得不同行中每个视频的所有观看次数,而不是聚集在一个值中。

那么我需要做什么才能将 Firebase 中不同字典中的所有值组合到一个变量中?

我很感激我能得到的所有帮助,我可以想象这应该不会太难,但我错过了一些东西。

编辑///我终于找到了问题所在。我传入的“StringUid”具有不同数量的值,因此如果用户的视频数量为 9,则整个函数将被调用 9 次。最终有效的解决方案如下所示:

全局数组声明:

              var myArray = [String]()

函数内部:

       if let dictionary = snapshot.value as? [String: AnyObject]{
            let numbOfViews = dictionary["views"] as! String
            let intConvert = Int(numbOfViews)!
            self.myArray.append(numbOfViews)
            let intArray = self.myArray.map { Int($0)!} 
            let total = intArray.reduce(0, +)
            self.totalViewsShower2.text = String(total)

提前谢谢您!

最佳答案

更新

如果您可以像这样直接打印字典中的值,那么解决方案可能就像这样简单

let total = dictionary.values.reduce(0, +)

或者如果值是字符串,您需要将它们转换为 Int

let total = dictionary.values.reduce(0) {sum, value -> Int in return sum + (Int(value) ?? 0)}

如果另一方面它们的值是字符串但定义为 Any 你需要额外的转换

let total2 = dictionary2.values.reduce(0) {sum, value -> Int in
    if let str = value as? String {
        return sum + (Int(str) ?? 0)
    }
    return 0
}    

我不太确定你的字典包含什么,但我假设是这样的

let dictionary: [String: Any] = ["views": ["1", "2", "3"]]

然后,您可以将“views”键的值转换为字符串数组,然后在该数组上使用 reduce 来获取总和

let array = dictionary["views"] as! [String]
let total = array.reduce(0) {sum, value -> Int in return sum + (Int(value) ?? 0)}

关于arrays - 将 firebase 中多个字典中的值添加到 Int 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55460831/

相关文章:

firebase - 根据 Google Data Studio 中的用户属性过滤 Firebase 分析事件

swift - Firebase 更新 : Initializer for conditional binding must have Optional type, 而不是 'String'

ruby - 如何在 Ruby 中查找数组中的特定字符

objective-c - 尝试在 objective-c 类中使用 swift 对象时“init”不可用

带标签的javascript多维数组

swift - TextView 将前两个字符大写而不是一个

ios - UiTextView 更改字体大小不起作用

javascript - 无法将变量输入到 Firebase 时间戳内的日期构造函数中?

arrays - 与在 Julia 中生成 Float 数组相比,将整数数组乘以 Float 会提高还是降低性能?

javascript - 将一个数组中的值插入多维数组并出现错误