Ios 使用Firebase时出现Swift结构错误(无法对不可变值使用mutating成员:';self';不可变)

Ios 使用Firebase时出现Swift结构错误(无法对不可变值使用mutating成员:';self';不可变),ios,swift,iphone,firebase,Ios,Swift,Iphone,Firebase,我有一个名为myObjectHolder的自定义struct,它有一个名为myArray的自定义struct(名为myObject)数组 我尝试获取存储在Firebase firestore中的数据,并将其附加到数组中(使用一个函数将Firebase文档转换为myObject) 我试着这样做: struct myObjectHolder { var myArray = [myObject]() private func fetchMyObjects() { l

我有一个名为
myObjectHolder
的自定义
struct
,它有一个名为
myArray
的自定义
struct
(名为
myObject
)数组

我尝试获取存储在
Firebase firestore
中的数据,并将其附加到数组中(使用一个函数将
Firebase
文档转换为
myObject

我试着这样做:

struct myObjectHolder {
    var myArray = [myObject]()


    private func fetchMyObjects() {
        let db = Firestore.firestore().collection("myObjects").getDocuments { (querySnapshot, err) in
        for document in querySnapshot!.documents {
            self.myArray.append(self.myObjectFromDocument(document: document)) //Error
        }
    }
}
出于某种原因,当我尝试将新的
myObject
附加到
myArray
时,我收到以下错误消息:

无法对不可变值使用变异成员:“self”是不可变的

有人知道我该怎么解决吗?(我正在使用
SwiftUI
它很重要)


谢谢大家!

使用类而不是结构是一种解决方案-如果您认为结构适合您的设计,那么使用

struct myObjectHolder {
    var myArray = [myObject]()


    private mutating func fetchMyObjects() {
        let db = Firestore.firestore().collection("myObjects").getDocuments { (querySnapshot, err) in
        for document in querySnapshot!.documents {
            self.myArray.append(self.myObjectFromDocument(document: document)) //Error
        }
    }
}

我刚刚将它从
struct
更改为
class
,它工作得非常好。

其他人之前所说的是正确的:您不能修改结构,因此您应该使用类,或者使结构可修改。有关更多详细信息,请查看

由于您特别提到Firestore,我建议您使用MVVM体系结构:

将数据访问逻辑放入视图模型中:

<代码>导入基础 导入FirebaseFirestore 导入FirebaseFirestoreSwift 类ThingViewModel:ObserveObject{ @已发布的var things=[things]() private var db=Firestore.Firestore() func fetchData(){ db.collection(“things”).addSnapshotListener{(querySnapshot,error)在 guard let documents=querySnapshot?.其他文档{ 打印(“无文件”) 返回 } self.things=documents.map{queryDocumentSnapshot->thingin 返回queryDocumentSnapshot.data(as:Thing.self) } } } } 在您的视图中,实例化视图模型并观察已发布的
things
数组:

struct ThingsListView:View{
@ObservedObject var viewModel=ThingsViewModel()
var body:一些观点{
导航视图{
列表(viewModel.things){thingin
VStack(对齐:。前导){
文本(thing.name)
.font(.headline)
}
}
.navigationBarTitle(“事物”)
.onAppear(){
self.viewModel.fetchData()
}
}
}
}

此外,最好将大写camelcase用于Swift结构和类:

此处需要使用类。相关/重复: