Итак, мой код работал отлично, но сегодня он возвращает nil, когда я пытаюсь преобразовать значение snapshot.value Firebase в Bool. Я вообще не вносил никаких изменений в код. Но он отлично работает, если я приведу его к String (поскольку? String возвращает "true").
Та же проблема в другом месте, где я выполнял приведение к [String: Bool].
Одно отличие от предыдущего: сегодня я установил Xcode 10 beta 3 (также установлен Xcode 9.4). Обе версии Xcode возвращают ноль. Вот код:
if let currentUserId = Auth.auth().currentUser?.uid{
Database.database().reference().child("users/\(currentUserId)/share").observe(.childAdded) { (snapshot) in
let data = snapshot.value as? Bool
if data == true{
self.showNotificationsBadge()
}
}
}
Редактировать: Снимок не равен нулю. Вы можете увидеть это на панели консоли. Я напечатал и snapshot.key, и .value.
Изменить 2: Прошу прощения, если мой вопрос вызвал недоразумение. Основная цель этого вопроса - узнать, в чем проблема, это Firebase SDK или Xcode. Потому что до сих пор он работал отлично. Я знаю, как с этим справиться и как преобразовать String в Bool.
Изменить 3: Всем спасибо за ответы. Мне жаль, что я не смог правильно выразить свои мысли. Я просто хочу знать об этом непредсказуемом поведении и почему это происходит? Кто здесь виноват? Xcode, Firebase SDK? Этот код работал ОТЛИЧНО около месяца. Я не прошу решения, мне просто интересно такое поведение. Было бы здорово, если бы кто-нибудь из команды Firebase смог объяснить эту проблему.
Изменить 4: Удалено изображение и добавлен код. Также выяснил проблему благодаря комментарию @Jay.
... и продублировал эти выводы; наличие узла "истина" вместо истины приводит к тому, что переменная данные будет равна нулю, как и ожидалось.
Я просто разместил изображение, чтобы показать код, отладчик и консоль в одном месте. Вы можете видеть в консоли, что я распечатал snapshot.key & .value. И значение верно, а не «верно». Но я понял вашу точку зрения. Я буду иметь это в виду и не буду публиковать изображения. Спасибо, что указали на структуру Firebase. Я только что разобрался в проблеме. Я писал true как Bool, а наш Android-разработчик делал это как String. Но все же любопытно, почему он не может преобразовать объект, содержащий true, в Bool. В любом случае, как я могу принять ваш ответ, если это комментарий?
... оставив ссылку на изображение, так как я удалил ее из вопроса. Здесь вы можете увидеть значение снимка в консоли.
Большой! Рад, что вы нашли проблему! Не нужно соглашаться, так как это обычная проблема, с которой сталкиваются люди.





Перед проверкой значения необходимо проверить, равен ли снимок нулю.
if let data = snapshot.value as? Bool {
.... }
да, вы правы, я должен сначала проверить это, но вы можете видеть в консоли, что я напечатал snapshot.key и .value, и ни один из них не равен нулю.
@Hadi Изменил ваш код на «наблюдение.значение», а не «наблюдение.childAdded». Попробуйте и дайте мне знать, если работает.
Это случилось со мной совсем недавно. Я обнаружил, что у меня есть кавычки вокруг дочернего значения, например. "правда". Удалите кавычки, и решение из @Maximo должно работать должным образом.
Скорее всего, в одном из ваших узлов есть что-то, что не является логическим значением (например, «истина» не является логическим значением). Попробуйте закомментировать код в закрытии и заменить его на печать (снимок) и проверить вывод в консоли. В общем, включите в свой вопрос фрагмент своей структуры Firebase. Кроме того, НЕ включайте изображения в свои вопросы. Включите код и структуры в виде текста. Чтобы получить структуру Firebase, используйте консоль Firebase-> Экспорт JSON и скопируйте вставленный фрагмент вашей структуры. См. изображения и ссылки - зло