【问题标题】:Unexpected non-void return value in void function - Swiftvoid函数中意外的非void返回值 - Swift
【发布时间】:2020-04-26 05:22:23
【问题描述】:

不让我返回用户名值,因为它在闭包中。有人可以向我解释如何使用@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
    }
}

【问题讨论】:

    标签: swift firebase return closures void


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      与其返回 String 值,不如将其设为闭包是一种更好的方法,因为 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)
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2021-06-27
        • 1970-01-01
        • 2015-11-14
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多