2
votes

Valeur de retour non-void inattendue dans la fonction void - Swift 4 (Firebase, Firestore)

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?


0 commentaires

3 Réponses :


0
votes

Votre fonction doit renvoyer Bool au lieu de String .


1 commentaires

Haha, je l'ai mal écrit sur la question. Je renvoie un Bool dans le projet. Corrigé



0
votes

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


0 commentaires

2
votes

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 >


4 commentaires

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 :)