【问题标题】:Error: Cannot Convert Value of Type "CueCardModel" to Closure Result Type "Void" SwiftUI错误:无法将“CueCardModel”类型的值转换为闭包结果类型“Void”SwiftUI
【发布时间】:2021-03-08 20:50:09
【问题描述】:

我正在尝试制作 Cue Card 应用程序。我有我的 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")
 }
}    

CueCardModel:

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

【问题讨论】:

    标签: xcode firebase mvvm swiftui


    【解决方案1】:

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

    【讨论】:

    • 旁注:我昨天还回答了您的一个问题,您在构建此应用程序时可能会有更多问题。我以前曾担任过您的职务,我建议您先参加 Swift + Firebase 的在线课程,然后再继续。
    • 从 initializeCues 返回的唯一方法是使用 @escaping 闭包?因为如果我从 initializeCues 中的函数打印,它打印得很好。只是不会返回任何东西。这是一个必修项目,所以很遗憾我现在不能花时间参加在线课程。但以后会的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 2023-02-05
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多