首页 > 解决方案 > 用于条件绑定的 Swift Initializer 必须具有 Optional 类型,而不是 if let 语句的“Bool”错误

问题描述

所以我在 Xcode 中编写一个应用程序,这是代码的一部分:

func Signup(_ sender: Any) {
        if let email = Email.text != nil, let password = 

在第二行我得到一个错误

条件绑定的初始化程序必须具有 Optional 类型,而不是 'Bool'

你能帮我吗?

标签: swift

解决方案


显然,你应该消除它!= nil

我还建议:

  • 修剪空白,以免有人进入空格以通过验证;
  • 使用isEmpty修剪过的字符串来确保那里有东西;
  • 以小写字母开头的属性和方法名称;
  • 我个人给我的UITextField属性一个TextField后缀(这样我就可以区分emailTextField文本字段和email字符串。

因此,也许是这样的:

@IBAction func didTapSignup(_ sender: Any) {
    guard let email = emailTextField.text?.trimmingCharacters(in: .whitespaces),
        !email.isEmpty,
        let password = passwordTextField.text?.trimmingCharacters(in: .whitespaces),
        !password.isEmpty else {
            // tell the user that validation failed here ...

            // ... and then return
            return
    }

    // do something with `email` and `password`
}

例如,您可能想要检查电子邮件和密码是否通过了一些基本规则:

let emailRegexString = "^[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$"  // oversimplified email regex

func isAcceptable(email: String, password: String) -> Bool {
    let isEmailAcceptable = email.range(of: emailRegexString, options: .regularExpression) != nil
    let isPasswordAcceptable = password.count > 4

    return isEmailAcceptable && isPasswordAcceptable
}

接着

@IBAction func didTapSignup(_ sender: Any) {
    guard let email = emailTextField.text?.trimmingCharacters(in: .whitespaces),
        let password = passwordTextField.text?.trimmingCharacters(in: .whitespaces),
        isAcceptable(email: email, password: password) else {
            // tell the user that validation failed here ...

            // ... and then return
            return
    }

    // do something with `email` and `password`
}

请注意,该 regex 是一种过于简化的电子邮件验证。但是如果你真的想要,你可以对正则表达式发疯。


我还至少要设置我的电子邮件和密码文本字段,以便不允许使用空格。因此,delegate为电子邮件和密码文本字段指定 ,然后禁止空格:

extension ViewController: UITextFieldDelegate {

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        return string.rangeOfCharacter(from: .whitespacesAndNewlines) == nil
    }

}

推荐阅读