当内容为nil时,不会返回Swift Guard语句

问题描述 投票:0回答:1

我正在编写用于注册和注册用户视图的代码。它应在运行更多代码之前检查textfield是否为nil。

当b为nil * / return时,让a = b else {/ *代码}

我知道如果b为零,则应返回保护声明在我的编码中b为nil,但是它没有返回不确定原因。我也打印出对我来说看起来像零的内容。谢谢

这里是编码

类userLoginView:UIViewController {

let realm = try! Realm()
var email:String?
var password:String?
var userResult:Results<userInfo>?
var logedin:Bool = false

@IBOutlet weak var emailtextfile: UITextField!
@IBOutlet weak var passwordtextfile: UITextField!
@IBOutlet weak var errorMessage: UILabel!

@IBOutlet weak var fnametext: UITextField!
@IBOutlet weak var lnametext: UITextField!
@IBOutlet weak var emailsigntext: UITextField!
@IBOutlet weak var signpasstext: UITextField!
@IBOutlet weak var passagaintext: UITextField!
@IBOutlet weak var contractortext: UITextField? = nil
@IBOutlet weak var signError: UILabel!

@IBAction func loginButton(_ sender: Any) {

    guard email == emailtextfile!.text,
        password == passwordtextfile!.text else{
            errorMessage?.text = "Please fill in your email and password"
            return
    }
    if checkUser(_email: email ?? "", _pass: password ?? "" ){
        logedin = true
        if let adminView = self.storyboard?.instantiateViewController(withIdentifier: "adminView") as? adminviewController{
            self.navigationController?.pushViewController(adminView, animated: true)
            UserDefaults.standard.set(email, forKey: "email")
            UserDefaults.standard.set(password, forKey: "password")

        }
    }else{
        errorMessage?.text = "Email or Password doesn't match our record"
    }
}

@IBAction func signupsegues(_ sender: UIButton!) {
    if let signupview =  storyboard?.instantiateViewController(withIdentifier: "signupView"){
            navigationController?.pushViewController(signupview, animated: true)
        }
}




@IBAction func signmeup(_ sender: UIButton!) {

    let contractor = contractortext?.text ?? ""
    guard let email = emailsigntext.text else{
        signError?.text = "Please fill in email"
        return}
    guard let fname = fnametext.text else{
        signError?.text = "Please fill in first name"
        return}
    guard let lname = lnametext.text else{
        signError?.text = "Please fill in last name"
        return}
    guard let pass = signpasstext.text else{
        signError?.text = "Please fill password"
        return}
    guard let passagain = passagaintext.text else{
        signError?.text = "Please fill confirm password"
            return
    }

    do{
        print("pass:" + pass)
        print("passagain" + passagain)
        print("email:" + email)
        print("fname:" + fname)
        print("lname:" + lname)


    try signupUser(_email: email, _firstname: fname, _lastName: lname, _password: pass, _comfirmpass: passagain, _contractor: contractor)
    }catch{
        print("some error")
    }
}

@IBAction func forgotButton(_ sender: Any) {
}

override func viewDidLoad() {
    super.viewDidLoad()

    userResult = realm.objects(userInfo.self)

}
override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}
func checkUser(_email:String, _pass:String) -> Bool {
    var checked:Bool = false
    let userrecord = userResult?.filter("userEmail = %@", email!)
    let emailrecord = userrecord?.first?.userEmail
    let passrecord = userrecord?.first?.userPass

    if (email == emailrecord && password == passrecord){
        checked = true
    }else {checked = false}
    return checked
}

func signupUser(_email:String!,_firstname:String!,_lastName:String!,_password:String!,_comfirmpass:String!,_contractor:String?) throws ->Void {

    if _password.elementsEqual(_comfirmpass) {
        let temp = userInfo(value: [_email!,_password!,_firstname!,_lastName!,_contractor ?? "",false])

        try realm.write {
                realm.add(temp)
        }
    }else{
        signError?.text = "password does not match"}

}

}

swift xcode swift5 guard
1个回答
0
投票

您可能使用了错误的图案。您应该使用guard let ...测试非零值。

var email: String? // nil

guard email == emailtextfile!.text ...将通过,如果两个字符串均为零。

要测试两个字符串都不为零,并且等于您的变量,您应该使用

guard let email = emailTextFile?.text, self.email == email, ... else {
    // stuff if email is nil
    return 
}
// stuff to do if email has a value and is equal to the value in the textfield
...

也请注意,无需强行打开文本框。 emailTextField?.text可以。

© www.soinside.com 2019 - 2024. All rights reserved.