我正在尝试创建电子邮件验证,以验证电子邮件中的字符@
和@
前后的字符。我能够做到,但是我无法将两者结合在一起。到目前为止,我拥有一个计算属性,该属性仅检查电子邮件是否包含@
。如何将它们结合在一起以检查所有条件。
extension String {
var isEmailFormat: Bool {
if let range = self.range(of: "@") {
_ = self[(self.startIndex)..<range.lowerBound]
_ = self[range.upperBound...]
}
return self.contains("@")
}
}
if !self.emailField.text!.isEmailFormat {
self.addErrorMessage("Invalid email address")
}
答案 0 :(得分:3)
其他(布尔)子句用逗号与可选绑定分开:
if let range = self.range(of: "@"), condition1, condition2 { ... }
但是,将切片辅助到_
不会进行任何测试,应该是这样的:
var isEmailFormat: Bool {
if let range = self.range(of: "@"),
range.lowerBound > startIndex,
range.upperBound < endIndex {
return true
} else {
return false
}
}
或者:
var isEmailFormat: Bool {
if let range = self.range(of: "@") {
return range.lowerBound > startIndex && range.upperBound < endIndex
} else {
return false
}
}
答案 1 :(得分:2)
在这种情况下最好使用正则表达式。
func isValidEmail(testStr:String) -> Bool {
let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
return emailTest.evaluate(with: testStr)
}
如果要使用2个布尔值,请使用类似return的语句
返回条件1 &&条件2
但我假设您已经知道。
答案 2 :(得分:1)
尝试这种方式
var isEmailFormat: Bool {
if let range = self.range(of: "@"),
range.lowerBound > self.startIndex,
range.upperBound < self.endIndex {
return true
} else {
return false
}
}
删除包含逻辑的逻辑
如果字符串本身不包含@
字符,则range
将故意为nil
。因此在这种情况下不是必需的。
答案 3 :(得分:0)
//Iam using Custom validator
func validatorEmail(TF1:UITextField,errorMsg:String = validatorConstants.errorMsg ,errorMsgEmail:String = validatorConstants.emailMsg,fieldName:String = "Email" ) -> Bool {
var error = validatorConstants.errorMsg
if fieldName.count > 0 {
error = validatorConstants.customMsg + fieldName
}
if TF1.text?.isEmpty == true{
// Any Notification
return false
}
if TF1.text?.isValidEmail == false{
// Any Notification
return false
}
return true
}
var isValidEmail: Bool {
let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
return emailTest.evaluate(with: self)
}
// call this function as
guard validator.validators(TF1: self.txtfied,fieldName: "FirstName") == false
else {
return
}