Ios Firebase如何检查快照';s的孩子属于Datasnapshot类型

Ios Firebase如何检查快照';s的孩子属于Datasnapshot类型,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,如何检查子项LojqctqkDpthbF_TYvP是否有其他Datasnapshots的子项,而不是k/v对,如例1 我尝试了所有这些,但没有一个奏效: Database.database().reference().child("LojqctqkDpthbF_TYvP").observeSingleEvent(of: .value, with: { (snapshot) in if !snapshot.hasChildren() { return } guard snaps

如何检查子项
LojqctqkDpthbF_TYvP
是否有其他
Datasnapshot
s的子项,而不是
k/v
对,如例1

我尝试了所有这些,但没有一个奏效:

Database.database().reference().child("LojqctqkDpthbF_TYvP").observeSingleEvent(of: .value, with: { (snapshot) in

    if !snapshot.hasChildren() { return }

    guard snapshot.children.allObjects is [DataSnapshot] else { return }

    guard let children = snapshot.children.allObjects as? [DataSnapshot] else { return }

    print("this print statement should only get reached if there are Datasnapshots underneath of it")

})
在上面的代码中(从例如下面的1),由于存在子项,但它们只是dict值,所以到达了print语句。我想要它,这样就不会特别接触到它,因为它下面没有任何Datasnapshots

例如1为dict值且无数据快照的子级

-LojqctqkDpthbF_TYvP
  |
  |---"key1":"value1"
  |---"key2":"value2"
  |---"key3":"value3"
-LojqctqkDpthbF_TYvP
  |
  |---"key1":"value1"
  |---"key2":"value2"
  |---"key3":"value3"
  |
  @-LlzB3_ppHHVmdipXs
  |     
  @-LlzD8p5-WOT-ZZhfc
只有在有如下中所示的数据快照时,才能访问print语句

例如,2个是dict值和2个datasnapshot的子对象

-LojqctqkDpthbF_TYvP
  |
  |---"key1":"value1"
  |---"key2":"value2"
  |---"key3":"value3"
-LojqctqkDpthbF_TYvP
  |
  |---"key1":"value1"
  |---"key2":"value2"
  |---"key3":"value3"
  |
  @-LlzB3_ppHHVmdipXs
  |     
  @-LlzD8p5-WOT-ZZhfc

您使用的定义有点不一致,这使得它很难实现

让我们首先设置数据库中哪些数据在客户端中成为
DataSnapshot
的正确定义:

假设数据库中有此JSON:

"-LojqctqkDpthbF_TYvP": {
  "key1": "value1",
  "key2": "value2",
  "key3": "value3"
}
如果将此JSON从数据库加载到应用程序中,您将获得一个带有键
-LojqctqkDpthbF_TYvP
的顶级快照。此快照有三个子快照,其中每个键对应一个子快照。每个键的值都是原始字符串值这一事实并不重要:它们仍然是一个
DataSnapshot
。因此,在上面的JSON中有四个快照,带有键
-LojqctqkDpthbF_TYvP
key1
key2
,和
key3


不同之处在于子
DataSnapshot
s的值的类型。因此,如果您想知道某个
DataSnapshot
的值本身是否也是一个复杂类型,您可以对每个子快照执行类似的操作:

snapshot?.value is Dictionary
或者,您可以检查每个子快照是否有子快照:

snapshot?.hasChildren()

对于
-LojqctqkDpthbF_TYvP
上述测试都是正确的,而对于其他键,它们都是错误的。

ahhh我不知道原语也会被视为Datasnapshot。谢谢你这么说!不过这很有意义,因为所有键都是字符串类型。大约一个小时后我会在电脑前试用。在我的问题中,我试过了,如果!snapshot.有孩子但没用是的,这是一种方法。谢谢,我让它工作了。实际上,我只是在下面加了一个孩子的名字,然后检查这个名字是否更容易,更重要的是更清楚。如往常一样,非常感谢你的帮助。干杯