Swift 无法转换类型为';无效';返回类型';(弦,弦,弦)和#x27;
我是Swift新手,我正在尝试返回在这个函数中创建的变量的值。我已经面对这个问题很长一段时间了,我希望任何人都能对此有所了解并帮助我。我尝试过更改函数的返回类型,但没有成功。任何帮助都将不胜感激 代码如下: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 { (
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)
}