Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 无法转换类型为';无效';返回类型';(弦,弦,弦)和#x27;_Swift_Firebase_Google Cloud Firestore - Fatal编程技术网

Swift 无法转换类型为';无效';返回类型';(弦,弦,弦)和#x27;

Swift 无法转换类型为';无效';返回类型';(弦,弦,弦)和#x27;,swift,firebase,google-cloud-firestore,Swift,Firebase,Google Cloud Firestore,我是Swift新手,我正在尝试返回在这个函数中创建的变量的值。我已经面对这个问题很长一段时间了,我希望任何人都能对此有所了解并帮助我。我尝试过更改函数的返回类型,但没有成功。任何帮助都将不胜感激 代码如下: func grabData1() -> (String, String, String) { db.collection("News").document("Article 1").getDocument { (

我是Swift新手,我正在尝试返回在这个函数中创建的变量的值。我已经面对这个问题很长一段时间了,我希望任何人都能对此有所了解并帮助我。我尝试过更改函数的返回类型,但没有成功。任何帮助都将不胜感激

代码如下:

func grabData1() -> (String, String, String)  {
       
        db.collection("News").document("Article 1").getDocument { (document, error) in
            if error == nil {
                if document != nil && document!.exists{
                    self.headline1 = document?.get("Headline").map(String.init(describing:)) ?? nil
                    var article = document?.get("Article").map(String.init(describing:)) ?? nil
                    var image1URL = URL(string: document?.get("Image") as! String)
                    return (headline1, article, image1URL)
                    
                }
            } 
        }
        
    } 

1-您需要创建一个模型,而不是使用元组

struct Item {
    let headline,article,imageURL:String
}
2-由于firebase调用是异步的,因此需要完成

func grabData1(completion:@escaping(Item -> ())) {
   
    db.collection("News").document("Article 1").getDocument { (document, error) in
        if error == nil {
            if document != nil && document!.exists{
                self.headline1 = document?.get("Headline").map(String.init(describing:)) ?? nil
                var article = document?.get("Article").map(String.init(describing:)) ?? nil
                var image1URL = URL(string: document?.get("Image") as! String)
                completion(Item(headline1:self.headline, article:article, imageURL:image1URL))
                
            }
        } 
    }
    
} 
召唤


您没有返回任何结果,因为您试图返回闭包中的值,因此您的函数在返回某些内容之前完成。您需要使用完成处理程序返回值。这意味着您将仅在调用它时返回值

func grabData1(completionHandler:@escaping(String, String, String)->())  {
   
    db.collection("News").document("Article 1").getDocument { (document, error) in
        if error == nil {
            if document != nil && document!.exists{
                self.headline1 = document?.get("Headline").map(String.init(describing:)) ?? nil
                var article = document?.get("Article").map(String.init(describing:)) ?? nil
                var image1URL = URL(string: document?.get("Image") as! String)
                completionHandler (headline1, article, image1URL)
            }
        } 
    }
    
} 
然后调用函数,如下所示:

grabData1() { headline, article, imageURL in 
    print(headline)
    print(article)
    print(imageURL)
}

当然,您可以使用数据模型对其进行改进,但这就是您问题的答案。

您实际上并没有在函数grabData1中返回任何内容。您实际要做的是调用函数getDocument,它将函数作为参数(在Swift中也称为闭包)。调用该函数后,方法返回的返回类型为void。这是因为正在异步检索文档。当文档存在时,可以使用文档(或发生的错误)调用您传递的闭包

如果函数的签名是

getDocument(onDocumentRetrieved:(DocumentType,ErrorType)->Void)
然后你可以用Swift写

getDocument{document,错误在…}
而不是

getDocument(onDocumentRetrieved:{文档,错误在…})
grabData1() { headline, article, imageURL in 
    print(headline)
    print(article)
    print(imageURL)
}