Swift 4:是否有比教程更简洁的nil检查方式?求简化多数据点代码
简化大量属性赋值的最优方案:利用Swift 4的Codable协议
嘿,我太懂你这种面对102个数据点要重复写赋值代码的痛苦了!先不说重复劳动,强制解包as!还容易触发运行时崩溃,咱们直接用Swift 4引入的Codable协议来彻底解决这个问题,这才是处理大量属性映射的优雅姿势。
第一步:让你的模型遵循Codable协议
假设你的类是这样的:
class YourModel: Codable { var id: Int? // 这里还有其他101个属性,比如name: String?, age: Int?等等 }
只要让类遵循Codable(Swift 4及以上默认支持,不需要额外导入框架),如果你的属性名和snap字典里的键完全一致,那几乎不用写额外代码。
第二步:直接从快照映射到模型
如果snap是Firestore的DocumentSnapshot,可以直接用它的data(as:)方法完成自动映射:
do { let model = try snap.data(as: YourModel.self) // 这里model已经包含了所有映射好的属性,你可以直接把self的属性替换成model的 self.id = model.id // 其他属性也可以批量替换,或者直接让self等于model(结构体的话更方便) } catch { print("映射失败:\(error)") }
如果snap是普通的[String: Any]字典,那可以用JSONDecoder来解码:
let jsonData = try JSONSerialization.data(withJSONObject: snap, options: []) let decoder = JSONDecoder() do { let model = try decoder.decode(YourModel.self, from: jsonData) self.id = model.id // 其他属性同理 } catch { print("解码失败:\(error)") }
如果属性名和键名不一致怎么办?
比如你的属性叫userId,但字典里的键是id,可以通过CodingKeys枚举来映射:
class YourModel: Codable { var userId: Int? // 其他属性... enum CodingKeys: String, CodingKey { case userId = "id" // 其他需要映射的键值对 } }
退而求其次:用反射(Mirror)批量赋值
如果暂时不想用Codable,也可以用Swift的反射机制来遍历属性批量赋值,避免重复写102次判断:
// 遍历self的所有属性 for case let (label?, value) in Mirror(reflecting: self).children { // 从snap中取出对应键的值 guard let rawValue = snap[label] else { continue } // 根据属性类型进行转换赋值,这里只举几个例子,你需要补充所有属性类型的处理 switch value { case is Int: self.setValue(rawValue as? Int, forKey: label) case is String: self.setValue(rawValue as? String, forKey: label) case is Bool: self.setValue(rawValue as? Bool, forKey: label) // 其他类型比如Double、Date等同理 default: print("未处理的属性类型:\(type(of: value))") } }
⚠️ 注意:这种方式需要你的类继承自NSObject,因为setValue(_:forKey:)是NSObject的方法;而且类型转换需要覆盖所有属性的类型,不然会有遗漏。
单条语句的简化写法(适合少量属性)
如果只是想简化单条赋值语句,替代你原来的三行代码,可以用可选绑定+安全转换,避免强制解包:
// 一行搞定,安全且简洁 if let id = snap["id"] as? Int { self.id = id }
或者用空合并运算符保持原有值(如果snap里没有值就不改变self.id):
self.id = snap["id"] as? Int ?? self.id
总之,Codable是处理大量属性映射的最优解,一次性解决重复代码和类型安全问题,以后维护也方便,强烈推荐你用这个方案!
内容的提问来源于stack exchange,提问作者jgravois
相关产品推荐
相关产品推荐

