Je veux donc une fonction booléenne qui renvoie true ou false selon que l'e-mail donné existe pour un utilisateur dans la collection users
.
Cependant, si j'essaie de renvoyer True ou
False
dans l'appel getDocuments
J'obtiens l'erreur: valeur de retour non-void dans la fonction void
func checkUserWith(email: String) -> Bool { let usersDB = database.collection("users") usersDB.whereField("email", isEqualTo: email).getDocuments { (snapshot, error) in if error != nil { print("Error: \(error?.localizedDescription ?? "")") return false } for document in (snapshot?.documents)! { if document.data()["email"]! as! String == email { return true } } return false } }
J'ai le sentiment que c'est parce que j'essaie de renvoyer un booléen dans l'appel Firestore qui attend un type de variable différent?
3 Réponses :
Votre fonction doit renvoyer Bool
au lieu de String
.
Haha, je l'ai mal écrit sur la question. Je renvoie un Bool dans le projet. Corrigé
change le type de retour de la fonction String en Bool
func checkUserWith(email: String) -> Bool { let usersDB = database.collection("users") usersDB.whereField("email", isEqualTo: email).getDocuments { (snapshot, error) in if error != nil { print("Error: \(error?.localizedDescription ?? "")") return false } for document in (snapshot?.documents)! { if document.data()["email"]! as! String == email { return true } } return false } }
Puisque l'opération firebase vous donne une fermeture de rappel et les appels effectués de manière asynchrone, je pense qu'il ne vous sera pas possible de revenir directement des fermetures. Cependant, vous pouvez renvoyer une fermeture d'échappement indiquant vrai ou faux comme suit ...
checkUserWith(email: emailHere) { (isSucceeded) in if isSucceeded { //it exists, do something } else { //user does not exist, do something else } }
Ensuite, lorsque vous appelez cette méthode:
func checkUserWith(email: String, completion: @escaping (Bool) -> Void) { let usersDB = database.collection("users") usersDB.whereField("email", isEqualTo: email).getDocuments { (snapshot, error) in if error != nil { print("Error: \(error?.localizedDescription ?? "")") completion(false) } for document in (snapshot?.documents)! { if document.data()["email"]! as! String == email { completion(true) return } } completion(false) } }
p >
Impossible de renvoyer cette variable à moins qu'elle ne soit en dehors de usersDB.whereField ("email", isEqualTo: email) .getDocuments {(snapshot, error) in
Malheureusement, elle reviendra avant la fin de ce rappel.
Vous avez raison. J'ai conseillé une approche différente en éditant ma réponse, pouvez-vous la vérifier?
Ça marche! J'ai fait quelques petits ajustements mais plus ou moins sur place. Merci de votre aide.
Merci d'avoir modifié, j'ai accepté les changements, heureux de vous aider :)