【问题标题】:Unable to access parameters from another file method无法从其他文件方法访问参数
【发布时间】:2021-07-26 19:08:03
【问题描述】:

我是 SwiftUI 领域的初学者,在开发我的第一个应用程序时遇到了麻烦。

我不知道为什么我无法从外部 swift 文件访问模型参数。

这是 FirebaseManager 文件:

import Foundation
import Firebase

class FirestoreManager : ObservableObject {

    @Published var serate = [SerateModel]()
    
    private var db = Firestore.firestore()
    
    func fetchData() {
        db.collection("Serate").addSnapshotListener{(querySnapshot, error) in
            guard let documents = querySnapshot?.documents else {
                print("No Documents")
                return
            }
        
            self.serate = documents.map{ ( queryDocumentSnapshot) -> SerateModel in
                let data = queryDocumentSnapshot.data()
                
                let name = data["name"] as? String ?? ""
                let author = data["author"] as? String ?? ""
                let image = data["image"] as? String ?? ""
                
                return SerateModel(nomeSerata: name, autoreSerata: author, immagineSerata: image)
            }
        }
    
    }

这里是不建议模型参数的视图文件:

import SwiftUI

struct CategoryView: View {
    @ObservedObject private var fire = FirestoreManager()
    
    var body: some View {
        ScrollView(.horizontal, showsIndicators:false){
            HStack {
                cardCategoryView(image: fire.serate.image, title: fire.serate.name, author: fire.serate.author)
            }
            .padding(EdgeInsets(top: 0, leading: 20, bottom: 0, trailing: 10))
        }
        .onAppear() {
            self.fire.fetchData()
        }
    }

}

特别是在最后一个文件的第 9 行,它不建议我使用 fire.serate.image,而只是建议我使用 fire.serate。

这也是模型文件:

struct SerateModel : Identifiable {
    var id : String = UUID().uuidString
    var nomeSerata : String
    var autoreSerata : String
    var immagineSerata : String
}

提前谢谢各位。


更新

jnpdx 提出的两种方案我都试过了,还是不行。

在这两种情况下,xCode 都无法向我建议完整路径 fire.serate.something

例如,对于变量Image,错误是:

“[SerateModel]”类型的值没有成员“图像”

谢谢

【问题讨论】:

    标签: firebase google-cloud-firestore swiftui


    【解决方案1】:

    您正在尝试访问SerateModelimagenameauthor 属性,它们没有这些名称的任何属性(至少在相同的语言中)。

    一种解决方案是更改访问名称的方式(如下所示)。

    其次,您的 serate 属性是 array 的 ``,而不是单个项目。因此,您必须使用 ForEach 之类的内容对其进行迭代。

    HStack {
      ForEach(fire.serate, id: \.id) { serate in 
        cardCategoryView(image: serate.immagineSerata, title: serate.nomeSerata, author: serate.autoreSerata)
      }
    }
    

    另一种选择是保留当前的 ​​cardCategoryView 行,但重命名模型上的属性:

    struct SerateModel : Identifiable {
        var id : String = UUID().uuidString
        var name : String
        var author : String
        var image : String
    }
    

    而且,当您在 fetchData 中创建它时:

    return SerateModel(name: name, author: author, image: image)
    

    【讨论】:

    • 谢谢,但是使用这两种方法我仍然遇到同样的问题。有什么建议吗?
    • 请根据您的尝试更新您的问题。不可能是完全相同的问题。
    • @FabrizioRocco 查看我的更新答案。您正在尝试访问 Array 上的单个元素。您必须遍历项目(或选择单个项目)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 2021-06-17
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多