【问题标题】:Problems With Error Casting In SwiftSwift 中的错误转换问题
【发布时间】:2017-03-28 06:26:52
【问题描述】:

不确定这是错误还是预期功能。

要在 Firebase 中使用电子邮件和密码创建用户,我一直在使用以下代码:

FIRAuth.auth()?.signIn(withEmail: email, password: password) { (user, error) in
    if let error = error {
        guard let error = error as? FIRAuthErrorCode else { return } // ALWAYS FAILS 
        ...code...
    }
    ...code...
}

方法的完成处理程序中的错误参数不能转换为FIRAuthErrorCode;它总是失败。这是一个错误,还是预期的行为?

编辑:我知道错误代码可用于区分不同类型的FIRAuthErrorCode 错误。它只是不可读,并且完成处理程序中的错误参数不是FIRAuthErrorCode类型没有多大意义。 FIRAuthErrorCode的案例和错误码可以查看here

【问题讨论】:

    标签: ios swift firebase firebase-authentication


    【解决方案1】:

    在就该问题联系 Firebase 支持后,他们说在完成处理程序中传回的错误只是 Error 对象。它们不是FIRAuthErrorCode 对象。要测试各种FIRAuthErrorCode 案例,必须执行以下操作:

    FIRAuth.auth()?.signIn(withEmail: email, password: password) { (user, error) in
        if let error = error {
            guard let error = FIRAuthErrorCode(rawValue: error._code) else {
                fatalError("This should never be executed")
            }
            switch error {
            case .errorCodeInvalidEmail: ...
            case .errorCodeWrongPassword: ...
            default: ...
    
            }
            ...code...
        }
        ...code...
    }
    

    ^ 这保留了可读性并使错误处理更加直观。而且,不需要错误转换!

    【讨论】:

      【解决方案2】:

      您是否尝试过使用guard let error = error as! FIRAuthErrorCode else { return } 强制转换并检查返回是否为零?

      【讨论】:

      • 您将无法编译这样做,因为它会导致条件绑定错误。使用as! 强制向下转换总是返回一个非可选值,因此使用guard let 没有意义。但是我之前确实测试过let error = error as! FIRAuthErrorCode,它产生了以下错误:Could not cast value of type 'NSError' (0x1149070b8) to '__C.FIRAuthErrorCode' (0x104e35718).
      【解决方案3】:

      您应该检查 firebase 中 signIn 方法的文档,以检查此方法可以发送的所有可能类型的错误,然后在代码中的保护块中检查这些类型的错误。

      【讨论】:

      • 我已经这样做了,但它需要使用错误代码(FIRAuthErrorCode 中各种情况的原始值)。我更喜欢使用错误代码名称(FIRAuthErrorCode.errorCodeEmailAlreadyInUse, FIRAuthErrorCode.errorCodeWrongPassword, etc...)。有人会认为从error 转换为FIRAuthErrorCode 会起作用。
      【解决方案4】:

      试试这个,我就是这样登录的,而且效果很好。

      FIRAuth.auth()?.signIn(withEmail: EmailField.text!, password: PasswordField.text!, completion: { user, error in
              if error == nil {
              print("Successfully Logged IN \(user!)")
              self.performSegue(withIdentifier: "Login", sender: self)
              }
          })
      

      我只是检查登录过程没有错误,然后执行我的 segue。

      【讨论】:

      • 我现有的代码在没有任何错误的情况下运行良好。我对此没有任何问题。这是我遇到问题的错误处理。我正在尝试处理无效的密码/电子邮件/等...
      猜你喜欢
      • 1970-01-01
      • 2016-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多