当内容为零时,Swift guard 语句不会返回



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

guard let a=b else{/*code when b is nil*/return}

我知道如果b为零,guard语句应该返回在我的编码中,b为零,但它没有返回,不确定原因。此外,我打印出的内容,它确实看起来像零对我来说。谢谢

这是编码

class 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"}
}

}

您可能使用的模式不正确。您应该使用guard let ...来测试非零值。

如果你有房地产

var email: String? // nil

然后

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

为了测试这两个字符串是否都不是nil,以及它是否等于您的变量,您应该使用

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
...

如果您正在测试非零、非空字符串,请按照问题注释中的建议尝试guard let email = ..., !email.isEmpty ... else { ... }

另外请注意,没有必要强制打开您的文本字段。emailTextField?.text即可。

看看API,UITextfield.text默认为@"",它桥接到Swift中的空字符串。

Guard用于在某些先决条件失败时提前退出。在您的情况下,如果用户在电子邮件和密码字段中输入了内容,您需要通过该保护,因此在登录按钮操作中,您需要更新代码,如:

@IBAction func loginButton(_ sender: Any) {
guard let email = emailtextfile.text, email.count > 0,
let password = passwordtextfile.text, password.count > 0 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"
}
}

我在那里更新的是将可选文本打开为非可选的本地变量电子邮件和密码,并将比较运算符更新为分配运算符。希望这能帮助你,你再也不会在那里撞车了。

如果;电子邮件";变量vas声明为全局:

guard (self.email != nil) else { return }

最新更新