意外的非void返回值在void函数中 - Swift

3
不让我返回用户名值,因为它在闭包中。请有人解释一下如何使用 @escaping 和 void 闭包。
错误:在 void 函数中出现意外的非 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个回答

2

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

1

不要返回字符串值,将其作为闭包返回是更好的方法,因为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)
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接