Xcode 7 + swift。 “在声明之前使用局部变量'_'错误

问题描述:

尝试创建函数来检查用户输入和存储数据时,出现上述错误。我的项目建立良好,直到我达到这个功能RegisterButtonTapped()。有没有人有一些结构或语法的变化,可以摆脱这个错误?Xcode 7 + swift。 “在声明之前使用局部变量'_'错误

@IBAction func RegisterButtonTapped(sender: AnyObject) { 

    let userEmail = userEmailTextField.text; 
    let userPassword = userEmailTextField.text; 
    let userRepeatPassword = userRepeatPasswordTextField.text; 


    // Check for empty fields 
    if(userEmail!.isEmpty || userPassword!.isEmpty || userRepeatPassword!.isEmpty){ 

     displayAlertMessage("All fields are required"); 

     return; 
    } 

    // Check if passwords match 
    if(userPassword != userRepeatPassword){ 

     displayAlertMessage("Passwords do not match"); 

     return; 
    } 

    // Store Data 
    NSUserDefaults.standardUserDefaults().setObject(userEmail, forKey: "userEmail"); 
    NSUserDefaults.standardUserDefaults().setObject(userEmail, forKey: "userPassword"); 
    NSUserDefaults.standardUserDefaults().synchronize(); 

    // Display Alert message with confirmation 
    var myAlert = UIAlertController(title:"Alert",message:"Registration is successful, thank you.",preferredStyle: UIAlertControllerStyle.Alert); 

    func displayAlertMessage(userMessage:String){ 

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

     let okAction = UIAlertAction(title:"ok",style: UIAlertActionStyle.Default, handler:nil); 

     myAlert.addAction(okAction); 
     self.presentViewController(myAlert, animated: true, completion: nil); 
    } // END OF FUNCTION 'displayAlertMessage()' 



} // END of FUNCTION 'RegisterButtonTapped()' 
+0

附注 - 我已经尝试清洗+重建项目,并重新启动Xcode。 –

+0

你已经在RegisterButtonTapped里面定义了'displayAlertMessage' ...并且使用了大小写函数名称。 – triandicAnt

+1

@ triple.s Swift嵌套函数 – Gruntcakes

您已经声明displayAlertMessage您呼叫后,将它的声明附近RegisterButtonTapped()如果你想保持它作为一个嵌套函数的顶部,否则将其移出RegisterButtonTapped的()。

除此之外,您有两个变量,都称为myAlert,第一个变量没用,并且您将userEmail保存为电子邮件和密码,并且不需要调用synchronize()。

有一些细节让它正确运行。 displayAlertMessage在调用之后被声明在注册函数中,并且我们得到警告。当您获得成功时,您必须使用成功消息调用该函数,并且不要在警报函数内声明var myAlert。最后的细节:当获取UITextFields值时,您会收到电子邮件输入字段并将其设置为密码值,因此验证将是错误的。

下面的代码示例是伟大工程:

class ViewController: UIViewController { 

    @IBOutlet var userEmailTextField:UITextField! 
    @IBOutlet var userPassTextField:UITextField! 
    @IBOutlet var userRepeatPasswordTextField:UITextField! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    @IBAction func RegisterButtonTapped(sender:UIButton) { 
     let userEmail = userEmailTextField.text; 
     let userPassword = userPassTextField.text; 
     let userRepeatPassword = userRepeatPasswordTextField.text; 


     // Check for empty fields 
     if(userEmail!.isEmpty || userPassword!.isEmpty || userRepeatPassword!.isEmpty){ 

      displayAlertMessage("All fields are required"); 

      return; 
     } 

     // Check if passwords match 
     if(userPassword != userRepeatPassword){ 

      displayAlertMessage("Passwords do not match"); 

      return; 
     } 

     // Store Data 
     NSUserDefaults.standardUserDefaults().setObject(userEmail, forKey: "userEmail"); 
     NSUserDefaults.standardUserDefaults().setObject(userEmail, forKey: "userPassword"); 
     NSUserDefaults.standardUserDefaults().synchronize(); 

     displayAlertMessage("Registration is successful, thank you.") 
    } 

    // Display Alert message with confirmation 
    func displayAlertMessage(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.presentViewController(myAlert, animated: true, completion: nil); 
    } 

} 
+0

“displayAlertMessage在注册函数内声明,就像我们得到的警告”。情况并非如此,Swift允许嵌套函数。 – Gruntcakes

+0

忘了说这个声明是在调用之后。进行了更改。 –

+0

您的改进工作完美。代码现在按预期运行。 –

当你有一个嵌套函数,你必须声明它之前,你可以调用它。在这种情况下,将“displayAlertMessage(userMessage:String)”函数移动到“//检查空字段”注释上方,然后它应该进行编译。