Swift使用==比较Firestore文档数据时报Any无法遵循Equatable错误
报错原因
Firestore 的 document.data() 方法返回的是 [String: Any] 类型的字典,Any 类型没有遵循 Equatable 协议,Swift 不支持直接对包含 Any 类型的集合使用 == 运算符做相等判断,所以会抛出这个错误。
解决方案
方案1:单独提取目标字段判断(推荐)
你当前只需要校验 did starting test 字段的值是否为0,直接提取对应字段做类型转换后比较即可,性能更高逻辑也更清晰。
func showInstructions() { let user = Auth.auth().currentUser let db = Firestore.firestore() // 用guard简化空值判断,避免多层嵌套 guard let user = user, let email = user.email else { return } let docRef = db.collection(email).document("starting test(squats)") docRef.getDocument { (document, error) in if let document = document, document.exists, let data = document.data() { // 单独提取目标字段,转成Int后比较 if let testStatus = data["did starting test"] as? Int, testStatus == 0 { // 此处写对应业务逻辑 } } else { print("Document does not exist") } } }
方案2:对比整个字典(适用于全量校验场景)
如果确实需要对比整个字典的所有键值对,可以借助Foundation框架的NSDictionary的isEqual方法,Swift的[String: Any]可以无缝桥接到NSDictionary:
// 替换原有的==比较语句即可 if (data as NSDictionary).isEqual(to: ["did starting test": 0]) { // 对应业务逻辑 }
注意:该方案仅适用于字典内的所有值都是Foundation支持的可相等判断的基础类型(数字、字符串、布尔、数组、字典等),Firestore返回的字段默认都符合这个要求。
内容的提问来源于stack exchange,提问作者Kiran Lim
相关产品推荐
相关产品推荐

