电子邮件和电话validation在Swift中

我使用以下代码进行电话号码validation。 但是我收到以下错误。 我无法进一步进行。 帮助我们继续前进。

class PhoneNumberValidation: Validation { let PHONE_REGEX = "^\\d{3}-\\d{3}-\\d{4}$" func validate(value: String) -> (Bool, ValidationErrorType) { if let phoneTest = NSPredicate(format: "SELF MATCHES %@", PHONE_REGEX) { if phoneTest.evaluateWithObject(value) { return (true, .NoError) } return (false, .PhoneNumber) } return (false, .PhoneNumber) } } 

错误:swift:15:28:条件绑定中的绑定值必须为可选types

是的,您的错误是在xcode 6.1以下

在这里输入图像说明

这个错误发生是因为IF条件有Bool返回types,但是在你的if条件中返回types是NSPredicate ,所以你得到了错误swift:171:28:绑定值在条件绑定中必须是可选types,你可以这样解决下面。

 var phoneTest = NSPredicate(format: "SELF MATCHES %@", PHONE_REGEX) if phoneTest.evaluateWithObject(value) { return (true, .NoError) } return (false, .PhoneNumber) } 

电子邮件validation在Swift中。

 func isValidEmail(testStr:String) -> Bool { print("validate emilId: \(testStr)") let emailRegEx = "^(?:(?:(?:(?: )*(?:(?:(?:\\t| )*\\r\\n)?(?:\\t| )+))+(?: )*)|(?: )+)?(?:(?:(?:[-A-Za-z0-9!#$%&'*+/=?^_'{|}~]+(?:\\.[-A-Za-z0-9!#$%&'*+/=?^_'{|}~]+)*)|(?:\"(?:(?:(?:(?: )*(?:(?:[!#-Z^-~]|\\[|\\])|(?:\\\\(?:\\t|[ -~]))))+(?: )*)|(?: )+)\"))(?:@)(?:(?:(?:[A-Za-z0-9](?:[-A-Za-z0-9]{0,61}[A-Za-z0-9])?)(?:\\.[A-Za-z0-9](?:[-A-Za-z0-9]{0,61}[A-Za-z0-9])?)*)|(?:\\[(?:(?:(?:(?:(?:[0-9]|(?:[1-9][0-9])|(?:1[0-9][0-9])|(?:2[0-4][0-9])|(?:25[0-5]))\\.){3}(?:[0-9]|(?:[1-9][0-9])|(?:1[0-9][0-9])|(?:2[0-4][0-9])|(?:25[0-5]))))|(?:(?:(?: )*[!-Z^-~])*(?: )*)|(?:[Vv][0-9A-Fa-f]+\\.[-A-Za-z0-9._~!$&'()*+,;=:]+))\\])))(?:(?:(?:(?: )*(?:(?:(?:\\t| )*\\r\\n)?(?:\\t| )+))+(?: )*)|(?: )+)?$" let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx) let result = emailTest.evaluateWithObject(testStr) return result } 

使用电子邮件validation:

 if isValidEmail("kirit@gmail.com"){ print("Validate EmailID") } else{ print("invalide EmailID") } 

电话号码validation在Swift中

 func validate(value: String) -> Bool { let PHONE_REGEX = "^\\d{3}-\\d{3}-\\d{4}$" let phoneTest = NSPredicate(format: "SELF MATCHES %@", PHONE_REGEX) let result = phoneTest.evaluateWithObject(value) return result } 

要么

您也可以在Swift中使用Demo项目进行validation

请参阅我的BLOG FOR ALL VALIDATION了解更多详情。

更新了Swift 2.0

将这些行粘贴到代码的任何位置(或者在常量文件中)

 extension String { //To check text field or String is blank or not var isBlank: Bool { get { let trimmed = stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet()) return trimmed.isEmpty } } //Validate Email var isEmail: Bool { do { let regex = try NSRegularExpression(pattern: "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}", options: .CaseInsensitive) return regex.firstMatchInString(self, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, self.characters.count)) != nil } catch { return false } } //validate PhoneNumber var isPhoneNumber: Bool { let charcter = NSCharacterSet(charactersInString: "+0123456789").invertedSet var filtered:NSString! let inputString:NSArray = self.componentsSeparatedByCharactersInSet(charcter) filtered = inputString.componentsJoinedByString("") return self == filtered } } 

使用电子邮件validation:

 if(txtEmail.isEmail){ } 

Swift 3.0更新的解决scheme:

// MARK: – validation扩展名 –

 extension String { //To check text field or String is blank or not var isBlank: Bool { get { let trimmed = trimmingCharacters(in: CharacterSet.whitespaces) return trimmed.isEmpty } } //Validate Email var isEmail: Bool { do { let regex = try NSRegularExpression(pattern: "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}", options: .caseInsensitive) return regex.firstMatch(in: self, options: NSRegularExpression.MatchingOptions(rawValue: 0), range: NSMakeRange(0, self.characters.count)) != nil } catch { return false } } var isAlphanumeric: Bool { return !isEmpty && range(of: "[^a-zA-Z0-9]", options: .regularExpression) == nil } //validate Password var isValidPassword: Bool { do { let regex = try NSRegularExpression(pattern: "^[a-zA-Z_0-9\\-_,;.:#+*?=!§$%&/()@]+$", options: .caseInsensitive) if(regex.firstMatch(in: self, options: NSRegularExpression.MatchingOptions(rawValue: 0), range: NSMakeRange(0, self.characters.count)) != nil){ if(self.characters.count>=6 && self.characters.count<=20){ return true }else{ return false } }else{ return false } } catch { return false } } } 

也许在Swift 2中更好的手机validation器:

 extension String { var isPhoneNumber: Bool { do { let detector = try NSDataDetector(types: NSTextCheckingType.PhoneNumber.rawValue) let matches = detector.matchesInString(self, options: [], range: NSMakeRange(0, self.characters.count)) if let res = matches.first { return res.resultType == .PhoneNumber && res.range.location == 0 && res.range.length == self.characters.count } else { return false } } catch { return false } } } 

以下代码在xcode 6.3 beta中起作用

 func isValidEmail(testStr:String) -> Bool { let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}" let range = testStr.rangeOfString(emailRegEx, options:.RegularExpressionSearch) let result = range != nil ? true : false return result } 

如何使用它:

防爆。

 if isValidEmail(email.text) == false{ //your code here } 

Swift 3:

 private func validate(phoneNumber: String) -> Bool { let charcterSet = NSCharacterSet(charactersIn: "+0123456789").inverted let inputString = phoneNumber.components(separatedBy: charcterSet) let filtered = inputString.joined(separator: "") return phoneNumber == filtered } 

电话正则expression式只适用于伊朗电话号码

 func isValidPhone(phone: String) -> Bool { let PHONE_REGEX = "^09[0-9'@s]{9,9}$" let phoneTest = NSPredicate(format: "SELF MATCHES %@", PHONE_REGEX) let result = phoneTest.evaluate(with: phone) return result } 

Swift 3 validation电子邮件

 class func validateEmail(email: String) -> Bool{ let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}" return NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluate(with: email) } 

电话号码validation

 class func validatePhoneNumber(value: String) -> Bool { let PHONE_REGEX = "^\\d{3}-\\d{3}-\\d{4}$" let phoneTest = NSPredicate(format: "SELF MATCHES %@", PHONE_REGEX) let result = phoneTest.evaluate(with: value) return result } 

Kirit Modi对Swift 3电子邮件validation的回复:

 func isValidEmail(testStr:String) -> Bool { let emailRegEx = "^(?:(?:(?:(?: )*(?:(?:(?:\\t| )*\\r\\n)?(?:\\t| )+))+(?: )*)|(?: )+)?(?:(?:(?:[-A-Za-z0-9!#$%&'*+/=?^_'{|}~]+(?:\\.[-A-Za-z0-9!#$%&'*+/=?^_'{|}~]+)*)|(?:\"(?:(?:(?:(?: )*(?:(?:[!#-Z^-~]|\\[|\\])|(?:\\\\(?:\\t|[ -~]))))+(?: )*)|(?: )+)\"))(?:@)(?:(?:(?:[A-Za-z0-9](?:[-A-Za-z0-9]{0,61}[A-Za-z0-9])?)(?:\\.[A-Za-z0-9](?:[-A-Za-z0-9]{0,61}[A-Za-z0-9])?)*)|(?:\\[(?:(?:(?:(?:(?:[0-9]|(?:[1-9][0-9])|(?:1[0-9][0-9])|(?:2[0-4][0-9])|(?:25[0-5]))\\.){3}(?:[0-9]|(?:[1-9][0-9])|(?:1[0-9][0-9])|(?:2[0-4][0-9])|(?:25[0-5]))))|(?:(?:(?: )*[!-Z^-~])*(?: )*)|(?:[Vv][0-9A-Fa-f]+\\.[-A-Za-z0-9._~!$&'()*+,;=:]+))\\])))(?:(?:(?:(?: )*(?:(?:(?:\\t| )*\\r\\n)?(?:\\t| )+))+(?: )*)|(?: )+)?$" let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx) let result = emailTest.evaluate(with: testStr) return result } 

对于Swift 3.0及以上

 var isPhoneNumber: Bool{ let allowedCharacters = CharacterSet(charactersIn: "+0123456789").inverted let inputString = components(separatedBy: allowedCharacters) let filtered = inputString.joined(separator: "") return self == filtered} 

File-New-File.Make一个名为AppExtension的Swift类。添加以下内容。

  extension UIViewController{ func validateEmailAndGetBoolValue(candidate: String) -> Bool { let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}" return NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluateWithObject(candidate) } } Use: var emailValidator:Bool? self.emailValidator = self.validateEmailAndGetBoolValue(resetEmail!) print("emailValidator : "+String(self.emailValidator?.boolValue)) Use a loop to alternate desired results. OR extension String { //Validate Email var isEmail: Bool { do { let regex = try NSRegularExpression(pattern: "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$", options: .CaseInsensitive) return regex.firstMatchInString(self, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, self.characters.count)) != nil } catch { return false } } } Use: if(resetEmail!.isEmail) { AppController().requestResetPassword(resetEmail!) self.view.makeToast(message: "Sending OTP") } else { self.view.makeToast(message: "Please enter a valid email") } 

更新了Swift 3

 extension String { var isPhoneNumber: Bool { do { let detector = try NSDataDetector(types: NSTextCheckingResult.CheckingType.phoneNumber.rawValue) let matches = detector.matches(in: self, options: [], range: NSMakeRange(0, self.characters.count)) if let res = matches.first { return res.resultType == .phoneNumber && res.range.location == 0 && res.range.length == self.characters.count } else { return false } } catch { return false } } } 

您可以创build单独的类进行validation,如下所示:

 enum AIValidationRule: Int { case EmptyCheck, MinMaxLength, FixedLength, EmailCheck, UpperCase, LowerCase, SpecialCharacter, DigitCheck, WhiteSpaces, None 

}

 let ValidationManager = AIValidationManager.sharedManager func validateTextField(txtField:AITextField, forRule rule:AIValidationRule, withMinimumChar minChar:Int, andMaximumChar maxChar:Int) -> (isValid:Bool, errMessage:String, txtFieldWhichFailedValidation:AITextField)? { switch rule { case .EmptyCheck: return (txtField.text?.characters.count == 0) ? (false,"Please enter \(txtField.placeholder!.lowercased())",txtField) : nil case .MinMaxLength: return (txtField.text!.characters.count < minChar || txtField.text!.characters.count > maxChar) ? (false,"\(txtField.placeholder!) should be of \(minChar) to \(maxChar) characters",txtField) : nil case .FixedLength: return (txtField.text!.characters.count != minChar) ? (false,"\(txtField.placeholder!) should be of \(minChar) characters",txtField) : nil case .EmailCheck: return (!(txtField.text?.isValidEmail())!) ? (false,"Please enter valid email",txtField) : nil case .UpperCase: return ((txtField.text! as NSString).rangeOfCharacter(from: NSCharacterSet.uppercaseLetters).location == NSNotFound) ? (false,"\(txtField.placeholder!) should contain atleast one uppercase letter",txtField) : nil case .LowerCase: return ((txtField.text! as NSString).rangeOfCharacter(from: NSCharacterSet.lowercaseLetters).location == NSNotFound) ? (false,"\(txtField.placeholder!) should contain atleast one lowercase letter",txtField) : nil case .SpecialCharacter: let symbolCharacterSet = NSMutableCharacterSet.symbol() symbolCharacterSet.formUnion(with: NSCharacterSet.punctuationCharacters) return ((txtField.text! as NSString).rangeOfCharacter(from: symbolCharacterSet as CharacterSet).location == NSNotFound) ? (false,"\(txtField.placeholder!) should contain atleast one special letter",txtField) : nil case .DigitCheck: return ((txtField.text! as NSString).rangeOfCharacter(from: NSCharacterSet(charactersIn: "0123456789") as CharacterSet).location == NSNotFound) ? (false,"\(txtField.placeholder!) should contain atleast one digit letter",txtField) : nil case .WhiteSpaces: return (txtField.text!.containsAdjacentSpaces() || txtField.text!.isLastCharcterAWhiteSpace()) ? (false,"\(txtField.placeholder!) seems to be invalid",txtField) : nil case .None: return nil } } func validateTextField(txtField:AITextField, forRules rules:[AIValidationRule]) -> (isValid:Bool, errMessage:String, txtFieldWhichFailedValidation:AITextField)? { return validateTextField(txtField: txtField, forRules: rules, withMinimumChar: 0, andMaximumChar: 0) } func validateTextField(txtField:AITextField, forRules rules:[AIValidationRule], withMinimumChar minChar:Int, andMaximumChar maxChar:Int) -> (isValid:Bool, errMessage:String, txtFieldWhichFailedValidation:AITextField)? { var strMessage:String = "" for eachRule in rules { if let result = validateTextField(txtField: txtField, forRule: eachRule, withMinimumChar: minChar, andMaximumChar: maxChar) { if(eachRule == AIValidationRule.EmptyCheck){ return result }else{ strMessage += "\(strMessage.characters.count == 0 ? "" : "\n\n") \(result.errMessage)" } } } return strMessage.characters.count > 0 ? (false,strMessage,txtField) : nil } 

使用Swift 3

  func validate(value: String) -> Bool { let PHONE_REGEX = "^\\d{3}-\\d{3}-\\d{4}$" let phoneTest = NSPredicate(format: "SELF MATCHES %@", PHONE_REGEX) let result = phoneTest.evaluate(with: value) return result } 

另一种解决scheme为各种缘故

 public extension String { public var validPhoneNumber:Bool { let types:NSTextCheckingType = [.PhoneNumber] guard let detector = try? NSDataDetector(types: types.rawValue) else { return false } if let match = detector.matchesInString(self, options: [], range: NSMakeRange(0, characters.count)).first?.phoneNumber { return match == self }else{ return false } } } //and use like so: if "16465551212".validPhoneNumber { print("valid phone number") }