# #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