2017-03-28 11 views
2

これがバグか目的の機能かどうかは不明です。Swiftでのエラーキャスティングの問題

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です。

答えて

0

問題について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... 
} 

を^これは読みやすさを維持し、エラーがより直感的に扱うことができます。そして、エラーキャスティングの必要はありません!

0

guard let error = error as! FIRAuthErrorCode else { return }を使用してキャスティングを強制し、リターンがゼロかどうかを確認しましたか?

+1

条件付きバインディングエラーが発生するため、コンパイルできません。 'as! 'を使ってダウンキャストを強制すると、常にオプションではない値が返されるので、' guard let'を使うのは意味がありません。しかし、私は試してみました。 FIRAuthErrorCode'を呼び出すと、次のエラーが発生しました: ''NSError'(0x1149070b8)型の値を '__C.FIRAuthErrorCode'(0x104e35718)にキャストできませんでした。 ' – hvasam

0

このメソッドが送信できるすべてのエラーのタイプをチェックし、コード内のガードブロックのエラーのタイプをチェックするには、firebaseのsignInメソッドのドキュメントを調べる必要があります。

+0

私は既に行っていますが、 ( 'FIRAuthErrorCode'の中のさまざまなケースの生の値)です。代わりにエラーコード名を使用することをお勧めします( 'FIRAuthErrorCode.errorCodeEmailAlreadyInUse、FIRAuthErrorCode.errorCodeWrongPassword、etc ...)'。 'error'から' FIRAuthErrorCode'へのキャストがうまくいくと思います。 – hvasam

0

これを試してみてください。これはどのように私のログインを行い、それがうまくいくようです。

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) 
     } 
    }) 

私はサインインプロセスにエラーがないことを確認してから、自分のセグを実行します。

+0

既存のコードは、エラーがない場合にうまく機能します。私はそれに問題はない。私が問題を抱えているのはエラー処理です。私は無効なパスワード/電子メール/ etcに対処しようとしています... – hvasam