Swift and Firebase Error: Cannot convert value of type 'UITextField' to expected argument type 'String'

Swift and Firebase Error: Cannot convert value of type 'UITextField' to expected argument type 'String'

首先,如果我使用了不正确的术语,我深表歉意,因为我对编码非常陌生,而且我正在选择 Swift 作为我的第一语言。

我尝试使用 Swift 和 Firebase 创建的重置密码功能似乎有一些问题,并且我在以下代码行中不断收到错误 "Cannot convert the value of type 'UITextField' to expected argument type 'String'":

Auth.auth().sendPasswordReset(withEmail: email)

重置密码的重置调用是以下 IB 操作的一部分,该操作根据输入到 UITextField 中的电子邮件重置密码,并检查以确保它是有效的电子邮件地址:

@IBAction func resetButton(_ sender: Any) {
    if let email = emailTextField {
        Auth.auth().sendPasswordReset(withEmail: email)
            func isValidEmail(_ email: String) -> Bool {
                let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,64}"

                let emailPred = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
                return emailPred.evaluate(with: email)
            }
        }
    }

有两个问题希望大家帮忙解决:

1) 如何解决这个我无法解决的错误?

2) 如果在 [=35] 中输入了无效的电子邮件地址,我如何编写 UI 以显示弹出消息以显示 "Please enter a valid email address" =]TextField?

感谢大家花时间阅读我的post,希望你们能帮助解决我的问题!

看起来 email 是一个 UITextField

您需要执行 UITextField.text 以获取 UITextField 的文本;对你来说,它是 email.text

但是,我会将您的 UITextField 重命名为 emailTextField 而不是 email

澄清:您在同一个方法中有 2 个 email 标识符。 if let email = emailTextFieldfunc isValidEmail(_ email: String) -> Bool {。您需要更改其中一项才能正确使用这些数据集。

基本上您尝试将 UITextField 放入 String 字段。似乎 emailTextFieldUITextField 而不是 String

代码实际是什么

@IBAction func resetButton(_ sender: Any) {
    if let email = emailTextField.text {
       if isValidEmail(email) {
           Auth.auth().sendPasswordReset(withEmail: email)
          } else {
             // Invalid email
        }
     }
 }

func isValidEmail(_ email: String) -> Bool {
      let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,64}"

      let emailPred = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
      return emailPred.evaluate(with: email)
 }

首先函数isValidEmail没有在IBAction中执行。无论在何处声明函数,都必须显式调用它。

错误很明显:email/emailTextField 是文本字段而不是字符串,您必须从其 text 属性 中获取文本。

resetButton 调用 isValidEmail,成功时发送字符串,失败时显示错误消息。

@IBAction func resetButton(_ sender: Any) {
    guard let email = emailTextField.text else { return }            
    if isValidEmail(email) {
        Auth.auth().sendPasswordReset(withEmail: email)
    } else {
        let alertController = UIAlertController(title: "Email validation failed", message: "Please enter a valid email address", preferredStyle: .alert)
        let okAction = UIAlertAction(title: "OK", style: .default, handler: nil)
        alertController.addAction(okAction)
        self.present(alertController, animated: true, completion: nil)
    }
}


func isValidEmail(_ email: String) -> Bool {
    let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,64}"
    let emailPred = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
    return emailPred.evaluate(with: email)
}