Swift中FirebaseFirestoreSwift是否有@Exclude属性包装器及属性排除方案?
FirebaseFirestoreSwift 排除属性相关问题解答
1. 是否有对应Android Exclude注解的属性包装器?
有的,FirebaseFirestoreSwift库提供了@Exclude属性包装器,功能和Android端的Exclude注解完全匹配:当你将Codable对象编码存入Firestore,或者从Firestore解码文档到对象时,被@Exclude标注的属性会被自动忽略,不会参与存/取流程。
示例代码:
import FirebaseFirestoreSwift struct User: Codable { @DocumentID var documentId: String? var username: String var profilePicUrl: String @Exclude var sessionToken: String // 该属性不会与Firestore交互 }
2. Swift Codable对象排除Firestore属性的最佳方式
首选:使用@Exclude属性包装器
这是最简洁、最贴合Firebase使用习惯的方案,代码语义清晰,无需手动编写复杂的编码/解码逻辑,适合绝大多数常规场景。只需给需要排除的属性添加@Exclude标注即可。
进阶:手动实现Codable协议
如果需要更灵活的控制(比如根据运行时条件决定是否排除属性,或同时适配其他编码场景),可以手动实现Codable的encode(to:)和init(from:)方法,通过自定义CodingKeys或编码逻辑跳过目标属性。
示例代码:
import FirebaseFirestoreSwift struct User: Codable { @DocumentID var documentId: String? var username: String var profilePicUrl: String var sessionToken: String // 无需添加@Exclude // 定义参与编码解码的键,排除sessionToken enum CodingKeys: String, CodingKey { case documentId, username, profilePicUrl } init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) documentId = try container.decodeIfPresent(String.self, forKey: .documentId) username = try container.decode(String.self, forKey: .username) profilePicUrl = try container.decode(String.self, forKey: .profilePicUrl) // 给本地属性设置默认值或自定义逻辑 sessionToken = UserDefaults.standard.string(forKey: "user_session") ?? "" } func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encodeIfPresent(documentId, forKey: .documentId) try container.encode(username, forKey: .username) try container.encode(profilePicUrl, forKey: .profilePicUrl) // 不编码sessionToken属性 } }
特殊场景:自定义编码器/解码器配置
如果需要批量或全局控制属性排除逻辑,可以在创建FirestoreEncoder或FirestoreDecoder时,通过userInfo传入自定义规则。不过这种方式复杂度较高,仅推荐用于特殊业务需求场景。
内容的提问来源于stack exchange,提问作者Paul B
相关产品推荐
相关产品推荐

