gpt4 book ai didi

ios - 当我尝试从 Firebase 检索数据库信息时,为什么 SwiftUI 会显示错误?

转载 作者:行者123 更新时间:2023-12-01 16:11:45 25 4
gpt4 key购买 nike

我最近一直在学习在 iOS 开发中使用 Firebase,并且一直遇到这个错误。我目前在我的数据库的“用户”集合中有两个文档,它们代表两个用户。我正在使用这个函数来从我的“用户”集合中检索所有数据:

func retrieveAllInfo() {
db.collection("users").getDocuments() { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
}
else {
for document in querySnapshot!.documents {
print("\(document.documentID) => \(document.data())")
}
}
}
}
但是,当我尝试将此功能实现为 SwiftUI 按钮的操作时,我收到此错误:

Cannot convert value of type '()' to expected argument type '() -> Void'


我真的不明白发生了什么。我能够使用我编写的函数将用户写入数据库作为 SwiftUI 按钮的操作,但这特别会引发错误。在我看来,它似乎没有任何返回类型(或者至少与我编写的写入数据库的函数不同)。这是我用来写入数据库的函数之一的示例:
    func addAlanTurning() { //Adding to a new document + collection
var ref: DocumentReference? = nil
ref = db.collection("users").addDocument(data: [
"first": "Alan",
"Middle": "Mathison",
"last" : "Turing",
"born" : 1912
]) { err in
if let err = err {
print("error adding document: \(err)")
} else {
print("Document added with ID: \(ref!.documentID)")
}
}
}
任何帮助将不胜感激。先感谢您。
编辑:
我设法将操作添加到按钮,但是,问题仍然以不同的形式存在。当我编写一个新函数来为每个用户的属性添加带有参数的用户时,当我尝试将已填充参数的函数添加到它时,该按钮会引发相同的错误。这是新功能:
func addUser(first: String, middle: String, last: String, age: Int) { //Adding to a new document + collection
var ref: DocumentReference? = nil
ref = db.collection("users").addDocument(data: [
"first": first,
"Middle": middle,
"last" : last,
"age" : age
]) { err in
if let err = err {
print("error adding document: \(err)")
} else {
print("Document added with ID: \(ref!.documentID)")
}
}
}
以下是它在引发错误的按钮中的实现方式:
struct ContentView: View {
let db = Firestore.firestore()

@State private var first: String = ""
@State private var middle: String = ""
@State private var last: String = ""
@State private var age: Int = 25

var body: some View {
VStack {
TextField("First Name:", text: $first)
TextField("Middle Name:", text: $middle)
TextField("Last Name:", text: $last)
Stepper(value: $age, in: 13...99) {
Text("Age: \(age)")
}
Button(action: addUser(first: first, middle: middle, last: last, age: age)) {
Text("Add User")
}
}
.padding()
}
先感谢您。

最佳答案

您必须在闭包周围放置花括号,如下所示:

Button(action: { addUser(first: first, middle: middle, last: last, age: age) }, label: {
Text("Button")
})
另外,我想建议将您所有的数据访问代码移动到 View 模型,甚至是存储/存储库中。以下文章很好地概述了如何做到这一点:
  • Fetching Data from Firestore in Real Time
  • Mapping Firestore Documents using Swift Codable
  • Adding Data to Firestore from a SwiftUI app
  • 关于ios - 当我尝试从 Firebase 检索数据库信息时,为什么 SwiftUI 会显示错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62748666/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com