上传对象数组 Firestore swift

Upload array of Objects Firestore swift

ich 使用 swift 和 firestore 并尝试实现类似于此的服务器:

    chatId: String
    eventCreatorId: String
    matchedUserId: String
    eventId: String
    messages: [
    {userId: String, timestamp:timestamp, messageText: String},
    {userId: String, timestamp:timestamp, messageText: String},
  ],

换句话说,对于 MVVM 设计,我想上传一系列模型 但是当我尝试使用这个

时出现类型错误
struct ChatModel: Codable {
    var chatId: String
    var eventCreatorId: String
    var matchedUserId: String
    var eventId: String
    var messages: [MessageModel]

}

struct MessageModel: Codable {
    var userId: String
    var timeStamp: Timestamp
    var messageText: String
    
}

如果我尝试上传就会出现错误

    func uploadMessage(messageText: String, chatId: String) -> Promise<Void> {
        return Promise { seal in
            guard let currentUser = Auth.auth().currentUser else {
                return
            }
            let timeStamp: Timestamp = Timestamp(date: Date())
            let messageModel = MessageModel(userId: currentUser.uid,timestamp: timeStamp, messageText: messageText)
            print(messageModel)
                let _ = db.collection("chats")
                    .document(chatId)
                    .updateData(["messages" : FieldValue.arrayUnion([messageModel])]) { error in
                        if let error = error {
                            seal.reject(error)
                        } else {
                            seal.fulfill(())
                        }
                    }
            }
        }
        
    }

我也尝试过不带时间戳,但是 运行 出现了同样的错误

谁能解释一下我做错了什么?

在 ArrayUnion 上,Firestore 无法理解您尝试传递的类型。 将结构转换为类型为 [String: Any] 的字典将忽略此错误 -

struct MessageModel: Codable {
    var userId: String
    var timeStamp: Timestamp
    var messageText: String
    
    var dictionary: [String: Any] {
        return["userId": userId,
               "timeStamp": timeStamp,
               "messageText": messageText]
    }
}

然后当您上传到 Firestore 时,您使用字典值:

 .updateData(["messages" : FieldValue.arrayUnion([messageModel.dictionary])]) { error in