【问题标题】:Multiple if let statements in Swift and FirebaseSwift 和 Firebase 中的多个 if let 语句
【发布时间】:2021-04-02 08:57:03
【问题描述】:

我正在尝试将我的回复与 Firebase 数据库中其他人的回复进行比较。我的脚本目前有 2 个 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语句是否执行了吗?您是否检查了第一个 if 语句的两个条件是否都满足?如果没有一些示例输入来说明如何重现问题,就不可能得到答案。
  • 是的,首先执行了 if 语句。我认为问题在于,一旦第一个 if 语句为真,第二个不再为真,所以它不会执行?不确定是否有更好的方法来编写此脚本。

标签: swift firebase firebase-realtime-database swift5


【解决方案1】:

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

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, let otheranswer = answerElement.value as? [String: Any] {
                let percentage = myanswer.similarity(with: otheranswer)
                similarities.append( Similarity(name: answerElement.key, percentage: percentage, answer: otheranswer) )
            }
        }

看这里

if self.currentUser.uid == answerElement.key

并注意下一个 if 嵌套在 inside 那一个

if self.currentUser.uid == answerElement.key
   if self.currentUser.uid != answerElement.key

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

通用解决方案是使用 if 和 else

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
}

还请注意,您在该代码中有一些可选项,如果这些选项为 nil,您的应用程序将崩溃或静默失败,不说明原因。

这段代码中的逻辑并不完全清楚

let percentage = myanswer.similarity(with: otheranswer)

每次循环

for answerElement in json {
}

在 answerElement 中只会有一个答案。例如不会有 myAnswer 和 otherAnswer,只会有 theAnswer。也许应该与循环中的先前答案进行比较;我将对此进行扩展

以下示例基于读取所有用户、获取该用户的答案、从结果中删除该用户,然后将其与其他用户的答案进行比较。假设用户 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
        }
    }
})

【讨论】:

  • 谢谢!问题是我需要同时运行这两个语句。本质上,我正在尝试“如果密钥是我的 uid,则提取我的数据;对于不是我的 uid 的密钥,提取数据。然后将我的数据与其他人的数据进行比较”。所以使用两个单独的 if 语句不能让我组合这两个数据,对吗?
  • @ml2008 我明白了。您的初始代码中存在问题,无论是该用户还是其他用户,您都在“拉”相同的数据answerElement.value as? [String: Any]。与其他用户数据相比,该用户数据是什么以及在哪里?
  • 它在同一张表中,这就是我尝试合并我的提取的原因。如果您在我的 firebase 表中看到,我的 uid 是 GqT6……而另一个人的 uid 是 HfL3……所以我想将我的回答是、是、是与他们的回答是、是、是的进行比较
  • @ml2008 去吧。如果您查看我的答案,您会看到,当您迭代 answerElements 时,如果是这个用户,那么做一些 answerElement.value 数据的事情,如果它是另一个用户对 answerElement.value 数据做一些事情.如果你想比较其他用户的答案和这个用户的答案,我会从数组中获取这个用户数据来跟踪它,然后从数组中删除它,然后遍历数组进行比较.
  • 超级有帮助!你介意分享一个从数组中删除后如何“跟踪它”的sn-p吗?
猜你喜欢
  • 1970-01-01
  • 2018-03-25
  • 2016-08-15
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 2017-05-29
  • 2018-09-16
  • 1970-01-01
相关资源
最近更新 更多