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

FirestoreSwift中DocumentReference编解码及@DocumentID报错问题

问题解决指南

一、解决「Unknown attribute 'DocumentID'」报错

这个错误是因为@DocumentID不属于基础Firestore库,而是来自FirebaseFirestoreSwift扩展库,按以下步骤修复:

  • 代码顶部必须导入FirebaseFirestoreSwift模块,同时保留基础的FirebaseFirestore导入:
    import FirebaseFirestore
    import FirebaseFirestoreSwift
    
  • 确认项目依赖已包含FirebaseFirestoreSwift:
    • Swift Package Manager:在项目依赖中添加Firebase官方包,勾选FirebaseFirestoreSwift
    • CocoaPods:在Podfile中添加pod 'FirebaseFirestoreSwift',执行pod install

二、让非Firestore字段ref支持编解码

因为ref不需要存储到Firestore,我们只需要让Codable忽略它,同时保留字段用于关联操作,具体实现:

  1. 将ref改为可变属性(var),方便后续手动赋值
  2. 在CodingKeys枚举中不包含ref,默认Codable逻辑会自动跳过该字段的编解码
  3. 从Firestore获取文档快照后,手动将快照的documentReference赋值给ref

修改后的完整代码

import FirebaseFirestore
import FirebaseFirestoreSwift

struct Organization: Codable, Identifiable {
    @DocumentID var id: String? // 自动映射Firestore文档ID,符合Identifiable协议
    var ref: DocumentReference? // 用于关联的文档引用,非Firestore存储字段
    let name: String

    enum CodingKeys: String, CodingKey {
        case name = "Name" // 映射Firestore中的"Name"字段
        // 无需加入id和ref:@DocumentID会自动处理id的编解码,ref则被忽略
    }
}

// 使用示例:从Firestore获取并关联文档引用
func fetchOrganization(from docRef: DocumentReference) async throws -> Organization {
    let snapshot = try await docRef.getDocument()
    var org = try snapshot.data(as: Organization.self)
    org.ref = docRef // 手动赋值文档引用
    return org
}

如果需要自定义编解码逻辑(比如特殊场景下处理ref),也可以手动实现编解码方法:

extension Organization {
    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        name = try container.decode(String.self, forKey: .name)
        ref = nil // 初始化时设为nil,后续手动赋值
        // @DocumentID修饰的id会被FirebaseFirestoreSwift自动解码,无需额外操作
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(name, forKey: .name)
        // 不编码ref,避免写入Firestore
    }
}

内容的提问来源于stack exchange,提问作者IT-Guy007

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 04:49:53