簡體   English   中英

傳遞給調用的參數在映射 firebase 提取調用時不帶 arguments

[英]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屬性,並且已經通過@Publishedchats廣播。無論如何嵌套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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM