Firebase重新认证报错:闭包预期2个参数但仅传入1个
Firebase Auth 删除账户时闭包参数不匹配报错修复
问题情况
在基于Firebase实现用户账户删除功能时,调用reauthenticate方法触发报错:
Contextual closure type '(AuthDataResult?, Error?) -> Void' expects 2 arguments, but 1 was used in closure body
初始实现代码:
@IBAction func deleteAccount() { let user = Auth.auth().currentUser var credential: AuthCredential user?.reauthenticate(with: credential) { error in if let error = error { self.redAlert(message: "Unable to authenticate. Please try again.") } else { Auth.auth().currentUser?.delete { error in if let error = error { self.redAlert(message: "An error happened. Please contact support to delete your account") } else { self.greenAlert(message: "Your account has been deleted") } } } }
问题原因
reauthenticate(with:completion:)方法的闭包要求接收两个参数:AuthDataResult?和Error?,但上述代码仅传入了error一个参数,不符合方法的定义规范。另外代码中credential变量未做实际初始化,也会导致后续运行异常。
解决代码
修正闭包参数并正确初始化认证凭证后,完整可运行的代码如下:
@IBAction func deleteAccount(_send: Any) { let user = Auth.auth().currentUser let emailText: String = email.text! let passwordText: String = password.text! var credential: AuthCredential = EmailAuthProvider.credential(withEmail: emailText, password: passwordText) user?.reauthenticate(with: credential, completion: { (result, error) in if let error = error { self.redAlert(message: "Unable to authenticate. Please try again.") } else { Auth.auth().currentUser?.delete { error in if let error = error { self.redAlert(message: "An error happened. Please contact support to delete your account") } else { self.greenAlert(message: "Your account has been deleted") self.stopLoading() self.logout() } } } }) }
核心修正点
- 为
reauthenticate的闭包补充第一个参数result(即使业务逻辑中不需要使用,也需遵循方法定义传入) - 通过
EmailAuthProvider.credential(withEmail:password:)生成有效的用户认证凭证,完成重新验证流程 - 新增了账户删除成功后的加载停止与登出逻辑,完善流程完整性
内容的提问来源于stack exchange,提问作者anchovy
相关产品推荐
相关产品推荐

