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
- Swift Package Manager:在项目依赖中添加Firebase官方包,勾选
二、让非Firestore字段ref支持编解码
因为ref不需要存储到Firestore,我们只需要让Codable忽略它,同时保留字段用于关联操作,具体实现:
- 将
ref改为可变属性(var),方便后续手动赋值 - 在
CodingKeys枚举中不包含ref,默认Codable逻辑会自动跳过该字段的编解码 - 从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
相关产品推荐
相关产品推荐

