Swift if语句执行自身而不是其他语句

Swift if语句执行自身而不是其他语句,swift,if-statement,execute,Swift,If Statement,Execute,我在这里有一个代码,每次运行它时,只有声明“所有字段都是必需的”的if语句起作用,但不仅仅是在必须调用它时,它实际上会代替其他语句运行。因此,无论我做什么,即使所有字段都已完成,我都会将“所有字段都是必需的”作为警告消息。 这是代码,非常感谢您的帮助,提前谢谢您 import UIKit class RegisterPageViewController: UIViewController { @IBOutlet weak var userEmailTextField: UITextFiel

我在这里有一个代码,每次运行它时,只有声明“所有字段都是必需的”的if语句起作用,但不仅仅是在必须调用它时,它实际上会代替其他语句运行。因此,无论我做什么,即使所有字段都已完成,我都会将“所有字段都是必需的”作为警告消息。 这是代码,非常感谢您的帮助,提前谢谢您

import UIKit

class RegisterPageViewController: UIViewController {


@IBOutlet weak var userEmailTextField: UITextField!
@IBOutlet weak var userPasswordTextField: UITextField!
@IBOutlet weak var repeatPasswordTextField: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
@IBAction func registerButtonTapped(_ sender: AnyObject) {

    let userEmail = ""
    let userPassword = ""
    let userRepeatPassword = ""



    // Check for empty fields


    if (userEmail.isEmpty || userPassword.isEmpty || 
userRepeatPassword.isEmpty)
    {
        // Display Alert Message
        displayMyAlertMessage(userMessage:"All fields are required")
        return
    }

    //Check if passwords match
    if (userPassword != userRepeatPassword)
    {
        // Display an alert message
        displayMyAlertMessage(userMessage:"Passwords do not match")
        return
    }


    // Store data
    UserDefaults.standard.set(userEmail, forKey:"userEmail")
    UserDefaults.standard.set(userEmail, forKey:"userPassword")
    UserDefaults.standard.synchronize()


    // Display alert message with confirmation
    _ = UIAlertController(title:"Alert", message:"Registration is 
successfull. Thank you!", 
preferredStyle:UIAlertControllerStyle.alert);

    _ = UIAlertAction(title:"Ok", style:UIAlertActionStyle.default)
    {
        action in
        self.dismiss(animated: true, completion:nil)
    }



 }


func displayMyAlertMessage(userMessage:String)
{

let myAlert = UIAlertController(title:"Alert", message: userMessage, 
preferredStyle:UIAlertControllerStyle.alert);


let okAction = UIAlertAction(title:"Ok", 
style:UIAlertActionStyle.default, handler:nil)

myAlert.addAction(okAction)

self.present(myAlert, animated:true, completion:nil)


}


}

您是否为userEmail、userPassword、userRepeatPassword分配过任何值?在函数开始时将它们初始化为空,看起来它们的值从未更改

不要在函数中声明它们,而是尝试使用类级变量,并将它们链接到脚本中的文本字段

@IBOutlet weak var userEmail: UITextField!
@IBOutlet weak var userPassword: UITextField!
@IBOutlet weak var userRepeatPassword: UITextField!

@IBAction func registerButtonTapped(_ sender: AnyObject) {
    // Check for empty fields
    if (self.userEmail.text.isEmpty || self.userPassword.text.isEmpty || self.userRepeatPassword.text.isEmpty) {
        // Display Alert Message
        displayMyAlertMessage(userMessage:"All fields are required")
        return
    }
    ...
}

我怀疑这段代码并不能准确地表示您的实现。您是否能够复制并粘贴未编辑的
注册表按钮(:)
函数

如果是的话,我同意@unmarshaled的说法:似乎您已经用一个空字符串声明了每个变量的值。如果您发布的代码完全按照上述方式实现,则这就是问题的原因

根据您发布的代码,我还建议进行以下修改:

  • 从功能范围之外获取电子邮件、密码和重复密码:通常,只需直接从用户界面获取,最常见的是从文本字段获取:即
    userEmailTextField.text

  • 将您的用户默认键和任何其他字符串文本提取到常量文件中是一种很好的做法,可以避免任何不必要的拼写错误

  • 如果您只想让UIAlertAction解除警报,则无需将处理程序添加到UIAlertAction
    UIAlterController
    将自动取消:处理程序参数的默认值为
    nil
    ,可以省略,只需:

    让okayButton=UIAlertAction(标题:“确定”,样式:。默认值)

  • 一般来说,您不希望存储对共享实例的引用。但是,在较小的局部范围内,这样做会更干净一些:

    让userDefaults=userDefaults.standard
    userDefaults.set(userEmail,forKey:“userEmail”)
    userDefaults.set(userEmail,forKey:“userPassword”)
    userDefaults.synchronize()

干杯:)

编辑:

为了可读性,我建议将条件输出提取到computed属性,并检查count==0而不是isEmpty。这样做的好处是可以使computed属性更全面,即检查字符串是否为nil或空。通常检查计数就足够了,但掩盖你的底数也没什么坏处

就目前的UIKit实现而言,
UITextField.text
永远不能是
nil
。尽管如此,官方文档并没有明确地做出保证,所以最好的处理方法是像下面的可选方法一样实现它

比如:

fileprivate var registrationFormCompleted: Bool {
    guard username = usernameTextfield.text,
    password = passwordTextField.text,
    repeat = repeatPasswordTextField.text, 
    else {
        return false
    }
    return username.count > 0 && 
    password.count > 0 &&
    repeat.count > 0
}
在使用中,它将是:

@IBAction func registerButtonTapped(_ sender: AnyObject) {
    // Check for empty fields
    if !registrationFormCompleted {
        // Display Alert Message
        displayMyAlertMessage(userMessage:"All fields are required")
        return
    }
    //....
}

isEmpty
String
而不是
UITextField
的函数,因此可以将变量声明为
String
或使用
.text
属性
textFields
。我编辑了我的文章,向您展示了我拥有的全部代码。