Swift中如何获取Optional类型的真实值?
问题根源
你遇到的问题本质是存储userId时的逻辑错误:在verifyCode方法里,你用String(describing: authResult?.user.uid)把Optional类型的用户ID转成了字符串,这会导致存到UserDefaults里的不是纯用户ID,而是类似Optional("12345")这样的字符串。所以后续读取时,哪怕你对userId强制解包,得到的也是这个带Optional()包裹的字符串,而非真实的用户ID。
修复方案
1. 修正存储userId的逻辑
要先正确提取非Optional的用户ID,再存入UserDefaults:
func verifyCode(code: String) { self.isLoadingVerify.toggle() let verificationId = UserDefaults.standard.string(forKey: "verificationId") ?? "" let credentials = PhoneAuthProvider.provider().credential(withVerificationID: verificationId, verificationCode: code) Auth.auth().signIn(with: credentials) { (authResult, error) in self.isLoadingVerify.toggle() if let error = error { self.isError.toggle() self.errorMsg = error.localizedDescription return } // 正确提取用户ID:用可选绑定确保拿到非Optional值 if let uid = authResult?.user.uid { self.userId = uid // 将真实的用户ID存入UserDefaults UserDefaults.standard.set(uid, forKey: "userId") } else { // 处理用户ID获取失败的情况 self.isError.toggle() self.errorMsg = "无法获取用户ID" return } self.isVerify.toggle() self.isVerified.toggle() } }
2. 安全读取userId的方式
修复存储后,读取时要避免强制解包(强制解包容易引发崩溃),推荐用可选绑定做安全处理:
// 安全读取userId if let userId = UserDefaults.standard.string(forKey: "userId"), !userId.isEmpty { let path = "images/\(userId)/\(UUID().uuidString).jpg" // 在这里使用path执行后续操作 } else { // 处理userId不存在或为空的异常情况 print("用户ID未找到") }
额外说明
如果之前已经错误存储了带Optional()的字符串,需要先清理UserDefaults里的旧值,或者在读取时做兼容处理(比如去掉字符串前后的Optional(和)),但更推荐直接修复存储逻辑,从根源解决问题。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

