xcode - 错误:无法将“CueCardModel”类型的值转换为闭包结果类型“Void”SwiftUI
问题描述
我正在尝试制作提示卡应用程序。我有我的 DataDownloader 类将我的 Firebase 数据库放入一个数组中,该数组传递给我的 CueCardViewModel,它从特定索引返回一个术语和答案到我的 CueCardView。
令人困惑......所以基本上,CueCardView 应该能够调用 CueCardViewModel 以从 DataDownloader 类的特定索引处获取术语和答案。我遇到的问题是 CueCardViewModel 不会返回。我是 Swift 的新手,并尝试过寻找一种方法来做到这一点,但我很困惑,因为大多数视频/论坛似乎都在硬编码他们的数据库,所以我遇到了麻烦。
提示卡视图:
import SwiftUI
struct CueCardView: View
{
var viewModel = CueCardViewModel()
@State private var isShowingAnswer = false
var body: some View
{
ZStack
{
RoundedRectangle(cornerRadius: 25, style: .continuous)
.fill(Color.white)
VStack
{
var a = getCue()
Text(a)
.onAppear
{
self.viewModel.initializeCues(index: 1)
}
}
.padding(20)
.multilineTextAlignment(.center)
}
.onTapGesture
{
self.isShowingAnswer.toggle()
}
}
}
extension CueCardView {
func getCue() -> String{
return "BBBBBBB"
}
}
struct C1_Previews: PreviewProvider {
static var previews: some View {
CueCardView().previewDevice("iPhone 12")
}
}
提示卡型号:
import SwiftUI
struct CueCardModel : Identifiable {
var id: String = UUID().uuidString
var term: String
var answer: String
}
数据下载器:
import SwiftUI
import Firebase
var dbRef = Firestore.firestore()
struct DataDownloader {
func downloadCues(completion: @escaping ([CueCardModel]) -> Void) {
var array = [CueCardModel]()
dbRef.collection("Cue").getDocuments(){(snap, err) in
if let err = err {
print(err)
} else {
guard let snap = snap else {return}
for doc in snap.documents {
let id = doc.documentID
let term = doc.get("term") as! String
let answer = doc.get("answer") as! String
let cue = CueCardModel(id: id, term: term, answer: answer)
array.append(cue)
}
completion(array)
}
}
}
}
CueCardViewModel:
import SwiftUI
import Firebase
class CueCardViewModel: ObservableObject {
let dataDownloader = DataDownloader()
func initializeCues(index :Int) -> [CueCardModel] {
dataDownloader.downloadCues{array in
return array[0]
}
}
}
解决方案
initializeCues 需要是一个类似于您的 downloadCues 函数的 @escaping 闭包。当您下载数据时,从数据库中获取信息并返回需要一些时间。因此您不能立即“返回”。