Несколько операторов if let в Swift и Firebase

Я пытаюсь сравнить свои ответы с ответами других людей в базе данных 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? Без некоторого примера ввода, который показывает, как воспроизвести проблему, ответ невозможен.

klangfarb 23.12.2020 19:52

да, сначала если оператор был выполнен. Я думаю, проблема в том, что когда первое утверждение if было истинным, второе больше не верно, поэтому оно не выполняется? Не уверен, что есть лучший способ написать этот скрипт.

ml2008 23.12.2020 19:58
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 self.currentUser.uid == answerElement.key
   if self.currentUser.uid != answerElement.key

Если эти две переменные равны снаружи if, они будут равны и внутри if, поэтому вторая проверка всегда будет терпеть неудачу.

Общее решение состоит в том, чтобы использовать and else с вашим 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
}

также обратите внимание, что у вас есть некоторые опции в этом коде, и если они обнулятся, ваше приложение либо выйдет из строя, либо молча выйдет из строя без указания причины.

Логика не совсем ясна в этом коде

let percentage = myanswer.similarity(with: otheranswer)

как каждый раз через цикл

for answerElement in json {
}

в answerElement будет только один ответ. например не будет моего Ответа и другого Ответа, будет только Ответ. Возможно, должно быть сравнение с предыдущим ответом из цикла; Я расскажу об этом

Вот пример, основанный на чтении всех пользователей, получении ответа для этого пользователя, удалении пользователя из результатов и последующем сравнении этого с ответами других пользователей. Предположим, что пользовательские 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 23.12.2020 20:23

@ml2008 Я понимаю. Проблема в вашем исходном коде, будь то этот пользователь или другой пользователь, вы «вытаскиваете» одни и те же данные answerElement.value as? [String: Any]. Что и где эти данные пользователей по сравнению с данными других пользователей?

Jay 23.12.2020 20:28

Он находится в той же таблице, поэтому я пытаюсь объединить свои выборки. Если вы видите в моей таблице firebase, мой uid — GqT6… и uid другого человека — HfL3… поэтому я хочу сравнить свои ответы да, да, да с их ответами да, да, да

ml2008 23.12.2020 20:31

@ml2008 Давай. Если вы посмотрите на мой ответ, вы увидите, что, когда вы перебираете answerElements, если это этот пользователь, то сделайте что-то с этими answerElement.value данными, а если это другой пользователь, сделайте что-то с этими answerElement.value данными. Если вы хотите сравнить ответы других пользователей с ответами этих пользователей, я бы получил эти данные пользователей из массива, чтобы отслеживать их, а затем удалить их из массива, а затем выполнить итерацию по массиву, выполняя сравнение.

Jay 23.12.2020 21:12

Супер полезно! Не могли бы вы поделиться фрагментом того, как «следить за ним» после его удаления из массива?

ml2008 23.12.2020 21:29

@ml2008 ml2008 Я обновил ответ - он должен указать вам направление и помочь очистить ваш код.

Jay 23.12.2020 22:09

Другие вопросы по теме