2017-03-28 3 views
2

Nicht sicher, ob dies ein Fehler oder eine beabsichtigte Funktion ist.Probleme mit Fehler in Swift

Um einen Benutzer mit einer E-Mail und Passwort in Firebase zu erstellen, habe ich den folgenden Code unter Verwendung von:

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

Der Fehlerparameter in dem Abschluss-Handler für das Verfahren nicht als FIRAuthErrorCode gegossen werden kann; es schlägt immer fehl. Ist das ein Fehler oder ist das das erwartete Verhalten?

Edit: Ich bin, dass Fehlercodes bekannt, verwendet werden kann zwischen den verschiedenen Arten von FIRAuthErrorCode Fehlern zu unterscheiden. Es ist einfach nicht lesbar, und es macht nicht viel Sinn, dass der Fehlerparameter im Completion-Handler nicht vom Typ FIRAuthErrorCode ist. Die Fälle und Fehlercodes von FIRAuthErrorCode können here gefunden werden.

Antwort

0

Nachdem Sie den Firebase-Support bezüglich des Problems kontaktiert haben, haben sie gesagt, dass die Fehler, die in Completion-Handlern zurückgegeben werden, nur Error Objekte sind. Sie waren nicht FIRAuthErrorCode Objekte. Um zu testen, für die verschiedenen FIRAuthErrorCode Fälle müßte man so etwas tun:

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

^Auf diese Weise bleibt die Lesbarkeit und macht Fehler intuitive Handhabung. Und es ist kein Fehler Casting erforderlich!

0

Haben Sie mit guard let error = error as! FIRAuthErrorCode else { return } versucht, das Casting zu zwingen, und prüfen Sie, ob die Rückkehr null ist oder nicht?

+1

Sie würden nicht in der Lage sein, das kompilieren zu tun, weil es in einem bedingten Bindung Fehler führen würde. Das Erzwingen eines Downcast mit 'as!' Gibt immer einen nicht-optionalen Wert zurück, daher ist es nicht sinnvoll, 'guard let' zu verwenden. Aber ich habe 'Let error = error as!' FIRAuthErrorCode' vor, und es erzeugt den folgenden Fehler: 'nicht Wert vom Typ‚NSError‘werfen konnte (0x1149070b8) auf‚__C.FIRAuthErrorCode‘(0x104e35718) .' – hvasam

0

sollten Sie überprüfen die Dokumentation von Signin Methode in Feuerbasis, um diese Methode kann die alle mögliche Art von Fehlern zu überprüfen, jene Art von Fehlern in Guard Block im Code senden und prüfen.

+0

Ich habe das bereits getan, aber es erfordert die Verwendung von Fehlercodes (Rohwerte der verschiedenen Fälle in 'FIRAuthErrorCode'). Ich würde stattdessen lieber die Fehlercodenamen verwenden ('FIRAuthErrorCode.errorCodeEmailAlreadyInUse, FIRAuthErrorCode.errorCodeWrongPassword, etc ...)'. Man würde meinen, dass das Umsetzen von "error" auf "FIRAuthErrorCode" funktionieren würde. – hvasam

0

Versuchen Sie dieses, es ist, wie ich meine Login tun und es scheint sehr gut zu funktionieren.

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

Ich überprüfe nur, dass es keinen Fehler mit dem Anmeldeprozess gibt, dann führe meinen Abschnitt aus.

+0

Mein bestehender Code funktioniert gut, wenn keine Fehler vorliegen. Ich habe damit keine Probleme. Es ist die Fehlerbehandlung, mit der ich Probleme habe. Ich versuche mit ungültigen Passwörtern/E-Mails/etc umzugehen ... – hvasam