[英]Argument passed to call that takes no arguments when mapping firebase fetch call
將 firebase 查詢的結果映射到我的 model 時出現此錯誤。
“傳遞給不帶參數的調用的參數”正好在返回對話點中。 為什么??????
我真的不知道為什么,可能是一些簡單的事情,希望 Peter Friese 會看到這篇文章......
@Published var chats = [Conversations]()
private let db = Firestore.firestore()
private let user = Auth.auth().currentUser
func getFilteredConversations(query: String) {
if (user != nil) {
db.collection("conversations").whereField("users", arrayContains: user!.displayName).addSnapshotListener { (querySnapshot, error) in
guard let documents = querySnapshot?.documents else {
print("no conversations found")
return
}
//mapping
self.chats = documents.map{(queryDocumentSnapshot) -> Conversations in
let data = queryDocumentSnapshot.data()
let docId = queryDocumentSnapshot.documentID
let users = data["users"] as? [String] ?? [""]
let msgs = data["messages"] as? [Message] ?? []
let unreadmsg = data["hasUnreadMessage"] as? Bool ?? false
//ERROR HERE!!!!! Argument passed to call that takes no arguments
return Conversations(id: docId, users: users, messages: msgs, hasUnreadMessage: unreadmsg)
}
}
}
}
class Conversations: Decodable, Identifiable, ObservableObject {
//var id: UUID { person.id }
var id: String = ""
var users: [String] = [""]
var messages: [Message] = []
var hasUnreadMessage : Bool = false
}
//ERROR here as well saying it's not decodable!
struct Message: Decodable, Identifiable {
enum MessageType {
case Sent, Received
}
let id = UUID()
let date: Date
let text: String
let type: MessageType?
init(_ text: String, type: MessageType, date: Date) {
self.date = date
self.text = text
self.type = type
}
init(_ text: String, type: MessageType) {
self.init(text, type: type, date: Date())
}
}
問題是Conversations
被定義為具有默認值且沒有初始化程序的class
。 因此,初始化它的唯一方法是使用Conversations()
(因此沒有 arguments 錯誤)。 相反, Conversations
幾乎肯定應該是一個struct
而不是一個ObservableObject
(它沒有任何@Published
屬性,並且已經通過@Published
的chats
廣播。無論如何嵌套ObservableObject
都充滿了其他問題,所以最好避免它):
struct Conversations: Decodable, Identifiable {
var id: String = ""
var users: [String] = [""]
var messages: [Message] = []
var hasUnreadMessage : Bool = false
}
要解決您的Codable
問題,請將MessageType
標記為Codable
,然后使用CodingKeys
告訴 Swift 沒有要解碼的id
:
struct Message: Decodable, Identifiable {
enum CodingKeys : CodingKey {
case date, text, type
}
enum MessageType : Codable {
case Sent, Received
}
let id = UUID()
let date: Date
let text: String
let type: MessageType?
init(_ text: String, type: MessageType, date: Date) {
self.date = date
self.text = text
self.type = type
}
init(_ text: String, type: MessageType) {
self.init(text, type: type, date: Date())
}
}
(我不清楚是否總會有一個解碼date
——如果你遇到這個問題,最好開始一個新的問題,因為它與原始問題無關)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.