首页 > 解决方案 > 错误:无法将“CueCardModel”类型的值转换为闭包结果类型“Void”SwiftUI

问题描述

我正在尝试制作提示卡应用程序。我有我的 DataDownloader 类将我的 Firebase 数据库放入一个数组中,该数组传递给我的 CueCardViewModel,它从特定索引返回一个术语和答案到我的 CueCardView。

令人困惑......所以基本上,CueCardView 应该能够调用 CueCardViewModel 以从 DataDownloader 类的特定索引处获取术语和答案。我遇到的问题是 CueCardViewModel 不会返回。我是 Swift 的新手,并尝试过寻找一种方法来做到这一点,但我很困惑,因为大多数视频/论坛似乎都在硬编码他们的数据库,所以我遇到了麻烦。

CueCardViewModel 错误图片

提示卡视图:

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

标签: xcodefirebasemvvmswiftui

解决方案


initializeCues 需要是一个类似于您的 downloadCues 函数的 @escaping 闭包。当您下载数据时,从数据库中获取信息并返回需要一些时间。因此您不能立即“返回”。


推荐阅读