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结构和类:此处需要使用类。相关/重复: