Неожиданное возвращаемое значение в функции void - Swift - PullRequest
0 голосов
/ 26 апреля 2020

Не позволяя мне вернуть значение имени пользователя, потому что оно в закрытии. Кто-нибудь, пожалуйста, объясните мне, как использовать @escaping и void closure

Ошибка: неожиданное не пустое возвращаемое значение в void функции

func grabUsername () -> String {
    let uid = Auth.auth().currentUser?.uid
    let database = Firestore.firestore().collection("Users").document(uid!)
    database.getDocument { (docSnapshot, error) in
           guard let docSnapshot = docSnapshot, docSnapshot.exists else {return}
           let mydata = docSnapshot.data()
           let username = mydata!["Username"] as? String ?? ""
           return username
    }
}

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

getDocument - это асинхронный метод с закрытием обратного вызова, который не имеет возврата, поэтому вы не можете вернуться из него, вместо этого вы должны применить результаты где-нибудь, например. в собственности

Таким образом, решение может быть следующим:

var username: String = ""

// ... other your code

func grabUsername () { // << async, no immediate return
    let uid = Auth.auth().currentUser?.uid
    let database = Firestore.firestore().collection("Users").document(uid!)
    database.getDocument { (docSnapshot, error) in
           guard let docSnapshot = docSnapshot, docSnapshot.exists else {return}
           let mydata = docSnapshot.data()
           let username = mydata!["Username"] as? String ?? ""

           DispatchQueue.main.async {
              self.username = username // << store result
           }
    }
}
0 голосов
/ 26 апреля 2020

Вместо того, чтобы возвращать строковое значение, лучше сделать его закрытием, поскольку database.getDocument возвращает ошибку и в замыкании.

Так что сделайте свою функцию замыканием.

вот так.

    func grabUsername (completion: @escaping (Error?, String?) -> Void) {
    let uid = Auth.auth().currentUser?.uid
    let database = Firestore.firestore().collection("Users").document(uid!)
    database.getDocument { (docSnapshot, error) in
        if error != nil {  completion(error.localizedDescription!, nil) } else {  guard let docSnapshot = docSnapshot, docSnapshot.exists else {return}
            let mydata = docSnapshot.data()
            let username = mydata!["Username"] as? String ?? ""
            completion(nil, username)
        }
    }
}
...