сравнение данных в документе firebase с использованием == дает протокол «Любой», поскольку тип не может соответствовать «Эквивалентному»

# #swift #google-cloud-firestore

Вопрос:

поэтому я хочу иметь возможность сравнить данные, хранящиеся в документе firestore, чтобы определить, делал ли пользователь что-то раньше. Но когда я включаю оператора == document data , он бросает меня Protocol 'Any' as a type cannot conform to 'Equatable'

 func showInstructions() {
    let user = Auth.auth().currentUser
    let db = Firestore.firestore()
    if user != nil {
        if let email = user?.email{
            let docRef = db.collection("(email)").document("starting test(squats)")
            docRef.getDocument { (document, error) in
                if let document = document, document.exists, let data = document.data(){
                    if data == ["did starting test": 0] { <- Protocol 'Any' as a type cannot conform to 'Equatable'
                        
                    }
                } else {
                    print("Document does not exist")
                }
            }
        }
    }
 

Комментарии:

1. Как говорится в ошибке, вы не можете сравнивать Any с чем-то другим, так как оно может быть любого типа. Сначала вам нужно ввести реальный тип.

2. что это значит и как мне это сделать

3. Вам следует провести какое-либо исследование протокола, и вы, безусловно, должны узнать, как и когда приводить значения только от одного типа к другому. Немного почитать docs.swift.org/swift-book/LanguageGuide/TypeCasting.html#ID342 amp;

4. Приведите свой data к ожидаемому типу: let data = document.data() as? [String: Int]

Ответ №1:

Как предлагали другие, вам необходимо указать Type data

Any тип, по сути, сообщает компилятору, что переменная может быть чем угодно, и компилятор недостаточно умен, чтобы определить, что это на самом деле такое само по себе

Обходной путь заключается в том casting , что вы говорите компилятору: «Это a… (Строка, Int, Bool и т.д.)»

в вашем случае это выглядело бы так

let data = document.data() as? [String: Int]

что говорит компилятору о том, что данные array -это файл с String ключом и Int значениями

обратите внимание, что если вы используете as? и информация, которую вы получили из Firestore, не соответствует вашим ожиданиям, приведение вместо этого вернет ноль. поэтому вам следует проверить это перед использованием data