Swift和Firebase中的多个if-let语句

Swift和Firebase中的多个if-let语句,swift,firebase,firebase-realtime-database,swift5,Swift,Firebase,Firebase Realtime Database,Swift5,我试图将我的回答与firebase数据库中其他人的回答进行比较。我的脚本目前有两个if语句,它们说如果这是我的响应,记录我的答案,然后用它与其他响应进行比较,但它没有注册我的第二个if语句 let responsesReference = Database.database().reference().child("responses") responsesReference.observeSingleEvent(of: .value) { (snapshot

我试图将我的回答与firebase数据库中其他人的回答进行比较。我的脚本目前有两个if语句,它们说如果这是我的响应,记录我的答案,然后用它与其他响应进行比较,但它没有注册我的第二个if语句

    let responsesReference = Database.database().reference().child("responses")
    responsesReference.observeSingleEvent(of: .value) { (snapshot: DataSnapshot) in
        guard let json = snapshot.value as? [String: Any] else { return }
            
        do {
            var similarities = [Similarity]()
            for answerElement in json {
                
                if self.currentUser.uid == answerElement.key,
                    let myanswer = answerElement.value as? [String: Any] {

                if self.currentUser.uid != answerElement.key, //DOES NOT REGISTER
                    let otheranswer = answerElement.value as? [String: Any] {
                    let percentage = myanswer.similarity(with: otheranswer)
                    similarities.append(
                        Similarity(name: answerElement.key, percentage: percentage, answer: otheranswer)
                    )
                }
            }
        }

            self.similarities = similarities.sorted(by: { (a, b) -> Bool in
                return a.percentage > b.percentage
            })
            self.tableView.reloadData()
        }

这是正确格式化的代码(我复制并粘贴了它,除了格式化之外没有任何更改)

看看这里

if self.currentUser.uid == answerElement.key
注意下一个if嵌套在该if中

如果这两个变量在外部If中相等,那么它们也将与内部If相等,因此第二次检查将始终失败

通用的解决方案是使用,或者与您的if一起使用

if self.currentUser.uid == answerElement.key {
   let myanswer = answerElement.value as? [String: Any] <- OPTIONAL!
   //do something because they are equal
} else {
   let otheranswer = answerElement.value as? [String: Any] <- OPTIONAL!
   // do something else because they are NOT equal
}
就像每次通过循环一样

for answerElement in json {
}
答案元素中只有一个答案。e、 不会有我的答案和其他答案,只有答案。也许应该与循环中先前的答案进行比较;我会详细介绍一下

下面是一个基于读取所有用户的示例,获取该用户的答案,从结果中删除该用户,然后将其与其他用户的答案进行比较。假设用户uid用于每个用户节点的密钥(其中还包含用户提供的答案),并且我们知道身份验证用户uid

let thisUsersUid = "uid_1"
let usersRef = self.ref.child("users") //self.ref points to MY firebase
usersRef.observeSingleEvent(of: .value, with: { snapshot in
    var allUsersSnap = snapshot.children.allObjects as! [DataSnapshot]
    guard let index = allUsersSnap.firstIndex { $0.key == thisUsersUid } else {
        print("no user: \(thisUsersUid) found")
        return
    }
    let thisUserSnap = allUsersSnap[index] //keep this so it can be compared later
    allUsersSnap.remove(at: index)
    let thisUsersAnswer = thisUserSnap.childSnapshot("answer").value as? String ?? "No Answer"

    for otherUserSnap in allUsersSnap {
        let otherUsersAnswer = otherUserSnap.childSnapshot("answer").value as? String ?? "No Answer"
        if orherUsersAnswer == thisUsersAnswer {
            //do something because the answers match
        }
    }
})

这是正确格式化的代码(我复制并粘贴了它,除了格式化之外没有任何更改)

看看这里

if self.currentUser.uid == answerElement.key
注意下一个if嵌套在该if中

如果这两个变量在外部If中相等,那么它们也将与内部If相等,因此第二次检查将始终失败

通用的解决方案是使用,或者与您的if一起使用

if self.currentUser.uid == answerElement.key {
   let myanswer = answerElement.value as? [String: Any] <- OPTIONAL!
   //do something because they are equal
} else {
   let otheranswer = answerElement.value as? [String: Any] <- OPTIONAL!
   // do something else because they are NOT equal
}
就像每次通过循环一样

for answerElement in json {
}
答案元素中只有一个答案。e、 不会有我的答案和其他答案,只有答案。也许应该与循环中先前的答案进行比较;我会详细介绍一下

下面是一个基于读取所有用户的示例,获取该用户的答案,从结果中删除该用户,然后将其与其他用户的答案进行比较。假设用户uid用于每个用户节点的密钥(其中还包含用户提供的答案),并且我们知道身份验证用户uid

let thisUsersUid = "uid_1"
let usersRef = self.ref.child("users") //self.ref points to MY firebase
usersRef.observeSingleEvent(of: .value, with: { snapshot in
    var allUsersSnap = snapshot.children.allObjects as! [DataSnapshot]
    guard let index = allUsersSnap.firstIndex { $0.key == thisUsersUid } else {
        print("no user: \(thisUsersUid) found")
        return
    }
    let thisUserSnap = allUsersSnap[index] //keep this so it can be compared later
    allUsersSnap.remove(at: index)
    let thisUsersAnswer = thisUserSnap.childSnapshot("answer").value as? String ?? "No Answer"

    for otherUserSnap in allUsersSnap {
        let otherUsersAnswer = otherUserSnap.childSnapshot("answer").value as? String ?? "No Answer"
        if orherUsersAnswer == thisUsersAnswer {
            //do something because the answers match
        }
    }
})

您知道是否执行了第一个if语句吗?您是否检查了第一个if语句的两个条件是否都满足?如果没有显示如何重现问题的示例输入,则不可能给出答案。是的,首先执行if语句。我认为问题在于,一旦第一个if语句为真,第二个if语句就不再为真,所以它不会执行?不确定是否有更好的方法编写此脚本。您知道是否执行了第一条if语句吗?您是否检查了第一个if语句的两个条件是否都满足?如果没有显示如何重现问题的示例输入,则不可能给出答案。是的,首先执行if语句。我认为问题在于,一旦第一个if语句为真,第二个if语句就不再为真,所以它不会执行?不确定是否有更好的方法来写这个脚本。谢谢!问题是我需要同时运行这两个语句。本质上,我是在尝试“如果密钥是我的uid,则提取我的数据;对于不是我的uid的密钥,则提取数据。然后将我的数据与其他人的数据进行比较”。因此,使用两个单独的if语句不能使我正确地组合这两个数据吗?@ml2008我理解。您的初始代码中存在问题,无论是该用户还是其他用户,您都在“提取”与相同的数据
answerElement.value作为?[字符串:任意]
。这个用户的数据和另一个用户的数据是什么,在哪里?它在同一个表中,这就是为什么我尝试合并我的回迁。如果你在我的firebase表中看到,我的uid是GqT6…另一个人的uid是HfL3。。。所以我想比较我的答案是,是,是和他们的答案是,是,yes@ml2008去吧。如果你看我的答案,你会发现,当你在answerElements上迭代时,如果是这个用户,那么做一些与answerElement.value相关的事情,如果是另一个用户,那么用answerElement.value相关的事情。如果您想将其他用户的答案与此用户的答案进行比较,我会从数组中获取此用户数据以跟踪它,然后从数组中删除该数据,然后在数组中进行迭代进行比较。非常有用!您是否介意分享一段如何在从阵列中删除后“跟踪它”的片段?谢谢!问题是我需要同时运行这两个语句。本质上,我是在尝试“如果密钥是我的uid,则提取我的数据;对于不是我的uid的密钥,则提取数据。然后将我的数据与其他人的数据进行比较”。因此,使用两个单独的if语句不能使我正确地组合这两个数据吗?@ml2008我理解。您的初始代码中存在问题,无论是该用户还是其他用户,您都在“提取”与相同的数据
answerElement.value作为?[字符串:任意]
。这个用户的数据和另一个用户的数据是什么,在哪里?它在同一个表中,这就是为什么我尝试合并我的回迁。如果你在我的firebase表中看到,我的uid是GqT6…另一个人的uid是HfL3。。。所以我想比较我的答案是,是,是和他们的答案是,是,yes@ml2008去吧。如果你看我的答案,你会发现,当你在answerElements上迭代时,如果是这个用户,那么做一些与answerElement.value相关的事情,如果是另一个用户,那么用answerElement.value相关的事情。如果您想将其他用户的答案与此用户的答案进行比较,我会从数组中获取此用户数据以跟踪它,然后从数组中删除该数据,然后在数组中进行迭代进行比较。非常有用!您是否介意分享一段如何在从阵列中删除后“跟踪它”的片段?