使用MessageKit时解包nil报错:chatPartnerId获取失败求助
问题分析与解决方案
崩溃根源
触发「Unexpectedly found nil while unwrapping」错误的核心原因是:从Firestore文档初始化Message的方法中,未将解析得到的fromID和toID赋值给结构体的对应属性,导致这两个属性始终为nil,当访问chatPartnerId时强制解包nil就会引发崩溃。
具体来看init?(document: QueryDocumentSnapshot)方法:你在guard语句中成功提取了fromID和toID,但后续没有执行self.fromID = fromID和self.toID = toID的赋值操作,结构体的fromID、toID属性保持默认的nil状态。
修复步骤
1. 修复文档初始化方法
在init?(document: QueryDocumentSnapshot)的guard语句之后,添加属性赋值代码:
init?(document: QueryDocumentSnapshot) { let data = document.data() guard let sentDate = data["created"] as? Timestamp, let senderId = data["senderId"] as? String, let fromID = data["fromID"] as? String, let toID = data["toID"] as? String, let senderName = data["senderName"] as? String else { return nil } id = document.documentID self.sentDate = sentDate.dateValue() sender = Sender(senderId: senderId, displayName: senderName) // 新增以下两行赋值代码 self.fromID = fromID self.toID = toID self.isFromCurrentUser = fromID == Auth.auth().currentUser?.uid if let content = data["content"] as? String { self.content = content downloadURL = nil } else if let urlString = data["url"] as? String, let url = URL(string: urlString) { downloadURL = url content = "" } else { return nil } }
2. 优化图片消息初始化逻辑
当前图片消息的init方法中,将fromID和toID赋值为空字符串"",逻辑上不符合实际业务场景,建议修改为接收fromID和toID参数,确保消息数据完整性:
init(user: User, image: UIImage, fromID: String, toID: String) { sender = Sender(senderId: user.uid!, displayName: user.name!) self.image = image content = "" self.fromID = fromID self.toID = toID sentDate = Date() id = nil }
3. 可选:避免强制解包风险
为了彻底杜绝类似崩溃,可以将chatPartnerId改为可选类型,或者提供默认值替代强制解包:
// 方案1:返回可选类型 var chatPartnerId: String? { return isFromCurrentUser ? toID : fromID } // 方案2:提供默认空字符串 var chatPartnerId: String { return isFromCurrentUser ? (toID ?? "") : (fromID ?? "") }
内容的提问来源于stack exchange,提问作者Vandal
相关产品推荐
相关产品推荐

