You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 15:36:05