Swift Firestore:如何根据VIP字段值实现不同业务逻辑?
Swift + Firestore 实现VIP权限校验逻辑
原代码的潜在问题
- 强制解包
UID!和document!,遇到用户未登录、文档不存在的场景会直接崩溃 - 硬假设
vip字段是String类型,实际Firestore中通常会存为Int类型,容易出现类型转换失败 - 未实现你需要的业务逻辑(还在打印0/1,没做“无法进入”提示和页面跳转)
修改后的完整代码
// 安全获取当前用户UID,避免强制解包崩溃 guard let uid = Auth.auth().currentUser?.uid else { self.showMsg(message: "请先登录") return } let db = Firestore.firestore() let docRef = db.collection("Users").document(uid) docRef.getDocument { [weak self] document, error in guard let self = self else { return } // 防止闭包循环引用 // 处理网络或Firestore请求错误 if let error = error { self.showMsg(message: "获取用户信息失败:\(error.localizedDescription)") return } // 校验用户文档是否存在 guard let document = document, document.exists else { self.showMsg(message: "用户信息不存在") return } // 读取VIP字段,兼容Int/String两种存储格式 let vipValue: Int if let vipInt = document.get("vip") as? Int { vipValue = vipInt } else if let vipString = document.get("vip") as? String, let intValue = Int(vipString) { vipValue = intValue } else { self.showMsg(message: "VIP信息异常") return } // 执行你需要的业务逻辑 switch vipValue { case 0: self.showMsg(message: "无法进入") case 1: // 跳转至指定页面,根据你的导航方式选择: // 方式1:导航栈跳转(如果当前在NavigationController中) let targetVC = TargetViewController() // 替换成你的目标ViewController类名 self.navigationController?.pushViewController(targetVC, animated: true) // 方式2:模态跳转 // self.present(targetVC, animated: true) default: self.showMsg(message: "VIP权限异常") } }
关键优化说明
- 用
guard let替代强制解包,大幅降低崩溃风险 - 加入
[weak self]避免闭包持有当前控制器导致内存泄漏 - 兼容VIP字段的Int/String两种存储类型,适配不同的Firestore数据结构
- 补充了文档不存在、字段异常等边界场景的错误提示
- 完全实现了你要的业务逻辑:VIP=0时显示“无法进入”,VIP=1时跳转到指定页面
内容的提问来源于stack exchange,提问作者lin lin
相关产品推荐
相关产品推荐

