代码之家  ›  专栏  ›  技术社区  ›  J Derbs

字典使用.keys-Swift更改索引位置

  •  0
  • J Derbs  · 技术社区  · 6 年前

    snapDict?.keys 元素的索引与它们在数据库中的索引不同。

    Database.database().reference().child("\(UserData().mySchool!)/posts").observeSingleEvent(of: .value, with: { (snapshot) in
                print(snapshot.childrenCount)
                let snapDict = snapshot.value as? [String: Any]
                print(snapshot.value!)
                let names = snapDict?.keys
                print(names!)
                for id in names! {
                    self.searchNames(id: id)
                    self.tableView.reloadData()
                }
            })
    

    这就是 在字典中看起来像在数据库中: enter image description here

    所以,你会想,当它们被放入字典时,它们会被印刷成 -LJRUC8n........-LOF6JUdm-onVuaq-zij ?

    snapDict?.keys
    

    印刷品:

    ["-LOBSAv_l5_x1xnKwx3_", "-LJRUC8nPF3Vg-DDGiYQ", "-LOBLXpTs39yLZo6EnHl", "-LOF6JUdm-onVuaq-zij", "-LODhXPQi8G7MX1bSfeb", "-LJaUiEnGOcBjKsTWSCS", "-LOBLZzrLAlzkhoidnKf"]
    

    我搞不懂这里的顺序/式样。按字母顺序排列的?你知道为什么订单会变成这样吗?

    1 回复  |  直到 6 年前
        1
  •  4
  •   Frank van Puffelen    6 年前

    根据定义,字典中的键是无序的。因此,当您将快照转换为字典时,有关节点顺序的任何信息都将丢失。

    除此之外,在读取数据之前,不需要指定顺序。

    要解决这两个问题:

    Database.database().reference()
      .child("\(UserData().mySchool!)/posts")
      .queryOrderedByKey()
      .observeSingleEvent(of: .value, with: { (snapshot) in
          print(snapshot.childrenCount)
          for child in snapshot.children.allObjects as! [FIRDataSnapshot] {
              print(child.value)     
          }
      })