From abc729aeac9a52a1b018de35cf4afe31eddc57ba Mon Sep 17 00:00:00 2001 From: Jeff Potter Date: Fri, 6 Mar 2015 14:59:06 -0700 Subject: [PATCH] Changing to version 2 --- README.md | 141 +++--------------- Validator.xcodeproj/project.pbxproj | 86 +++++------ .../UserInterfaceState.xcuserstate | Bin 23414 -> 27069 bytes Validator/Base.lproj/Main.storyboard | 109 +++++++++++--- Validator/ConfirmRule.swift | 32 ++++ Validator/EmailRule.swift | 40 +++++ Validator/EmailValidation.swift | 26 ---- Validator/FullNameRule.swift | 30 ++++ Validator/FullNameValidation.swift | 22 --- Validator/MaxLengthValidation.swift | 20 --- Validator/MinLengthRule.swift | 32 ++++ Validator/MinLengthValidation.swift | 20 --- ...ordValidation.swift => PasswordRule.swift} | 29 +++- Validator/PhoneNumberRule.swift | 33 ++++ Validator/PhoneNumberValidation.swift | 24 --- Validator/RequiredRule.swift | 30 ++++ Validator/RequiredValidation.swift | 19 --- Validator/{Validation.swift => Rule.swift} | 7 +- Validator/ValidationError.swift | 7 +- Validator/ValidationErrorType.swift | 43 ------ Validator/ValidationFactory.swift | 32 ---- Validator/ValidationRule.swift | 15 +- Validator/ValidationRuleType.swift | 20 --- Validator/Validator.swift | 51 +++---- Validator/ViewController.swift | 89 +++++------ Validator/ZipCodeRule.swift | 38 +++++ Validator/ZipCodeValidation.swift | 24 --- 27 files changed, 470 insertions(+), 549 deletions(-) create mode 100644 Validator/ConfirmRule.swift create mode 100644 Validator/EmailRule.swift delete mode 100644 Validator/EmailValidation.swift create mode 100644 Validator/FullNameRule.swift delete mode 100644 Validator/FullNameValidation.swift delete mode 100644 Validator/MaxLengthValidation.swift create mode 100644 Validator/MinLengthRule.swift delete mode 100644 Validator/MinLengthValidation.swift rename Validator/{PasswordValidation.swift => PasswordRule.swift} (59%) create mode 100644 Validator/PhoneNumberRule.swift delete mode 100644 Validator/PhoneNumberValidation.swift create mode 100644 Validator/RequiredRule.swift delete mode 100644 Validator/RequiredValidation.swift rename Validator/{Validation.swift => Rule.swift} (63%) delete mode 100644 Validator/ValidationErrorType.swift delete mode 100644 Validator/ValidationFactory.swift delete mode 100644 Validator/ValidationRuleType.swift create mode 100644 Validator/ZipCodeRule.swift delete mode 100644 Validator/ZipCodeValidation.swift diff --git a/README.md b/README.md index b2d982a..5ffaf52 100644 --- a/README.md +++ b/README.md @@ -7,15 +7,15 @@ Swift Validator is a rule-based validation library for Swift. ## Core Concepts -* ```UITextField``` + ```ValidationRule``` go into ```Validator``` -* ```UITextField``` + ```ValidationError``` come out of ```Validator``` -* ```UITextField``` is registered to ```Validator``` -* ```Validator``` evaluates ```ValidationRules``` sequentially and stops evaluating when a ```ValidationRule``` fails. +* ``UITextField`` + ``ValidationRule`` go into ```Validator`` +* ``ITextField`` + ``ValidationError`` come out of ```Validator`` +* ``UITextField`` is registered to ``Validator`` +* ``Validator`` evaluates ``ValidationRules`` sequentially and stops evaluating when a ``ValidationRule`` fails. * Keys are used to allow field registration in TableViewControllers and complex view hierarchies ## Quick Start -Initialize the ```Validator``` by setting a delegate to a View Controller or other object. +Initialize the ``Validator`` by setting a delegate to a View Controller or other object. ```swift @@ -33,31 +33,22 @@ Register the fields that you want to validate ```swift -var fields:[String] = ["FullName", "Email", "Phone"] +// Validation Rules are evaluated from left to right. +validator.registerField(fullNameTextField, rules: [RequiredRule(), FullNameRule()]) -// Validation Rules are evaluated from left to right. The first rule is ValidationRuleType.Required the second is ValidationRuleType.FullName. -validator.registerFieldByKey(fields[0], textField:nameTextField, rules: [.Required, .FullName]) -validator.registerFieldByKey(fields[1], textField:emailTextField, rules: [.Required, .Email]) -validator.registerFieldByKe(fields[2], textField:phoneTextField, rules: [.Required, .PhoneNumber]) +// You can pass in error labels with your rules + +validator.registerField(emailTextField, errorLabel: emailErrorLabel, rules: [RequiredRule(), EmailRule()]) + +// You can validate against other fields +validator.registerField(emailConfirmTextField, errorLabel: emailConfirmErrorLabel, rules: [RequiredRule(), EmailRule(), ConfirmationRule(confirmField: emailTextField)]) + +// You can now pass in regex and length parameters through overloaded contructors +validator.registerField(phoneNumberTextField, errorLabel: phoneNumberErrorLabel, rules: [RequiredRule(), MinLengthRule(length: 9)]) +validator.registerField(zipcodeTextField, errorLabel: zipcodeErrorLabel, rules: [RequiredRule(), ZipCodeRule()]) ``` -Validate Individual Field - -```swift - -validator.validateFieldByKey(fields[0], delegate:self) - -// ValidationFieldDelegate methods -func validationFieldSuccess(key:String, validField:UITextField){ - validField.backgroundColor = UIColor.greenColor() -} - -func validationFieldFailure(key:String, error:ValidationError){ - println(error.error.description) -} - -``` Validate All Fields @@ -104,109 +95,11 @@ class SSNValidation: Validation { } -``` - -Add the ```ValidationRuleType.SocialSecurity``` - -```swift - -enum ValidationRuleType { - case Required, - Email, - Password, - MinLength, - MaxLength, - ZipCode, - PhoneNumber, - FullName, - SocialSecurity // Added to the ValidationRuleTypes -} - -``` - -Add the ```ValidationErrorType.SocialSecurity``` and ```description()``` - -```swift - -enum ValidationErrorType { - case Required, - Email, - Password, - MinLength, - MaxLength, - ZipCode, - PhoneNumber, - FullName, - SocialSecurity, // Added to the ValidationErrorTypes - NoError - - func description() -> String { - switch self { - case .Required: - return "Required field" - case .Email: - return "Must be a valid email" - case .MaxLength: - return "This field should be less than" - case .ZipCode: - return "5 digit zipcode" - case .PhoneNumber: - return "10 digit phone number" - case .Password: - return "Must be at least 8 characters" - case .FullName: - return "Provide a first & last name" - // Adding the desired error message - case .SocialSecurity: - return "SSN is XXX-XX-XXXX" - default: - return "" - } - } - -} - -``` -Register the ```SSNValidation``` with the ```ValidationFactory``` - -```swift - -class ValidationFactory { - class func validationForRule(rule:ValidationRuleType) -> Validation { - switch rule { - case .Required: - return RequiredValidation() - case .Email: - return EmailValidation() - case .MinLength: - return MinLengthValidation() - case .MaxLength: - return MaxLengthValidation() - case .PhoneNumber: - return PhoneNumberValidation() - case .ZipCode: - return ZipCodeValidation() - case .FullName: - return FullNameValidation() - // Add Validation to allow Factory to create one on the fly for you - case .SocialSecurity: - return SSNValidation() - default: - return RequiredValidation() - } - } -} - -``` Credits ------- Swift Validator is written and maintained by Jeff Potter [@jpotts18](http://twitter.com/jpotts18) and friends. -Currently funded and maintained by [RingSeven](http://ringseven.com) - -![RingSeven](https://avatars1.githubusercontent.com/u/8309133?v=3&s=200) - ## Contributing 1. [Fork it](https://github.com/jpotts18/swift-validator/fork) diff --git a/Validator.xcodeproj/project.pbxproj b/Validator.xcodeproj/project.pbxproj index c91fb52..15d806a 100644 --- a/Validator.xcodeproj/project.pbxproj +++ b/Validator.xcodeproj/project.pbxproj @@ -7,27 +7,23 @@ objects = { /* Begin PBXBuildFile section */ + 628637261AAA474B00BC8FCF /* MinLengthRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 628637251AAA474B00BC8FCF /* MinLengthRule.swift */; }; + 628637281AAA49E300BC8FCF /* ConfirmRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 628637271AAA49E300BC8FCF /* ConfirmRule.swift */; }; 62D1AE1D1A1E6D4400E4DFF8 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE1C1A1E6D4400E4DFF8 /* AppDelegate.swift */; }; 62D1AE1F1A1E6D4400E4DFF8 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE1E1A1E6D4400E4DFF8 /* ViewController.swift */; }; 62D1AE221A1E6D4400E4DFF8 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 62D1AE201A1E6D4400E4DFF8 /* Main.storyboard */; }; 62D1AE241A1E6D4400E4DFF8 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 62D1AE231A1E6D4400E4DFF8 /* Images.xcassets */; }; 62D1AE271A1E6D4400E4DFF8 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 62D1AE251A1E6D4400E4DFF8 /* LaunchScreen.xib */; }; 62D1AE331A1E6D4500E4DFF8 /* ValidatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE321A1E6D4500E4DFF8 /* ValidatorTests.swift */; }; - 62D1AE3E1A1E6FEF00E4DFF8 /* FullNameValidation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE3D1A1E6FEF00E4DFF8 /* FullNameValidation.swift */; }; - 62D1AE491A1E6FF800E4DFF8 /* EmailValidation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE3F1A1E6FF800E4DFF8 /* EmailValidation.swift */; }; - 62D1AE4A1A1E6FF800E4DFF8 /* MaxLengthValidation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE401A1E6FF800E4DFF8 /* MaxLengthValidation.swift */; }; - 62D1AE4B1A1E6FF800E4DFF8 /* MinLengthValidation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE411A1E6FF800E4DFF8 /* MinLengthValidation.swift */; }; - 62D1AE4C1A1E6FF800E4DFF8 /* PhoneNumberValidation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE421A1E6FF800E4DFF8 /* PhoneNumberValidation.swift */; }; - 62D1AE4D1A1E6FF800E4DFF8 /* RequiredValidation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE431A1E6FF800E4DFF8 /* RequiredValidation.swift */; }; - 62D1AE4E1A1E6FF800E4DFF8 /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE441A1E6FF800E4DFF8 /* Validation.swift */; }; 62D1AE4F1A1E6FF800E4DFF8 /* ValidationError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE451A1E6FF800E4DFF8 /* ValidationError.swift */; }; - 62D1AE501A1E6FF800E4DFF8 /* ValidationErrorType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE461A1E6FF800E4DFF8 /* ValidationErrorType.swift */; }; - 62D1AE511A1E6FF800E4DFF8 /* ValidationFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE471A1E6FF800E4DFF8 /* ValidationFactory.swift */; }; 62D1AE521A1E6FF800E4DFF8 /* ValidationRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE481A1E6FF800E4DFF8 /* ValidationRule.swift */; }; - 62D1AE571A1E700200E4DFF8 /* ValidationRuleType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE531A1E700200E4DFF8 /* ValidationRuleType.swift */; }; 62D1AE581A1E700200E4DFF8 /* Validator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE541A1E700200E4DFF8 /* Validator.swift */; }; - 62D1AE591A1E700200E4DFF8 /* ZipCodeValidation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE551A1E700200E4DFF8 /* ZipCodeValidation.swift */; }; - 62D1AE5A1A1E700200E4DFF8 /* PasswordValidation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE561A1E700200E4DFF8 /* PasswordValidation.swift */; }; + 62DC8D651AAA42520095DFA7 /* Rule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62DC8D641AAA42520095DFA7 /* Rule.swift */; }; + 62DC8D681AAA42920095DFA7 /* FullNameRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62DC8D671AAA42920095DFA7 /* FullNameRule.swift */; }; + 62DC8D6C1AAA42CE0095DFA7 /* EmailRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62DC8D691AAA42CE0095DFA7 /* EmailRule.swift */; }; + 62DC8D6D1AAA42CE0095DFA7 /* RequiredRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62DC8D6A1AAA42CE0095DFA7 /* RequiredRule.swift */; }; + 62DC8D6E1AAA42CE0095DFA7 /* PasswordRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62DC8D6B1AAA42CE0095DFA7 /* PasswordRule.swift */; }; + 62DC8D711AAA43110095DFA7 /* ZipCodeRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62DC8D701AAA43110095DFA7 /* ZipCodeRule.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -41,6 +37,8 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 628637251AAA474B00BC8FCF /* MinLengthRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MinLengthRule.swift; sourceTree = ""; }; + 628637271AAA49E300BC8FCF /* ConfirmRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfirmRule.swift; sourceTree = ""; }; 62D1AE171A1E6D4400E4DFF8 /* Validator.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Validator.app; sourceTree = BUILT_PRODUCTS_DIR; }; 62D1AE1B1A1E6D4400E4DFF8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 62D1AE1C1A1E6D4400E4DFF8 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -51,21 +49,15 @@ 62D1AE2C1A1E6D4500E4DFF8 /* ValidatorTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ValidatorTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 62D1AE311A1E6D4500E4DFF8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 62D1AE321A1E6D4500E4DFF8 /* ValidatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ValidatorTests.swift; sourceTree = ""; }; - 62D1AE3D1A1E6FEF00E4DFF8 /* FullNameValidation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FullNameValidation.swift; sourceTree = ""; }; - 62D1AE3F1A1E6FF800E4DFF8 /* EmailValidation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EmailValidation.swift; sourceTree = ""; }; - 62D1AE401A1E6FF800E4DFF8 /* MaxLengthValidation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MaxLengthValidation.swift; sourceTree = ""; }; - 62D1AE411A1E6FF800E4DFF8 /* MinLengthValidation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MinLengthValidation.swift; sourceTree = ""; }; - 62D1AE421A1E6FF800E4DFF8 /* PhoneNumberValidation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhoneNumberValidation.swift; sourceTree = ""; }; - 62D1AE431A1E6FF800E4DFF8 /* RequiredValidation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RequiredValidation.swift; sourceTree = ""; }; - 62D1AE441A1E6FF800E4DFF8 /* Validation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Validation.swift; sourceTree = ""; }; 62D1AE451A1E6FF800E4DFF8 /* ValidationError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValidationError.swift; sourceTree = ""; }; - 62D1AE461A1E6FF800E4DFF8 /* ValidationErrorType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValidationErrorType.swift; sourceTree = ""; }; - 62D1AE471A1E6FF800E4DFF8 /* ValidationFactory.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValidationFactory.swift; sourceTree = ""; }; 62D1AE481A1E6FF800E4DFF8 /* ValidationRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValidationRule.swift; sourceTree = ""; }; - 62D1AE531A1E700200E4DFF8 /* ValidationRuleType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValidationRuleType.swift; sourceTree = ""; }; 62D1AE541A1E700200E4DFF8 /* Validator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Validator.swift; sourceTree = ""; }; - 62D1AE551A1E700200E4DFF8 /* ZipCodeValidation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZipCodeValidation.swift; sourceTree = ""; }; - 62D1AE561A1E700200E4DFF8 /* PasswordValidation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PasswordValidation.swift; sourceTree = ""; }; + 62DC8D641AAA42520095DFA7 /* Rule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Rule.swift; sourceTree = ""; }; + 62DC8D671AAA42920095DFA7 /* FullNameRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FullNameRule.swift; sourceTree = ""; }; + 62DC8D691AAA42CE0095DFA7 /* EmailRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EmailRule.swift; sourceTree = ""; }; + 62DC8D6A1AAA42CE0095DFA7 /* RequiredRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RequiredRule.swift; sourceTree = ""; }; + 62DC8D6B1AAA42CE0095DFA7 /* PasswordRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PasswordRule.swift; sourceTree = ""; }; + 62DC8D701AAA43110095DFA7 /* ZipCodeRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZipCodeRule.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -89,8 +81,8 @@ 626BE5EE1A9B8EC600FE6D5C /* Swift-Validator */ = { isa = PBXGroup; children = ( + 62DC8D661AAA42700095DFA7 /* Rules */, 62D1AE3C1A1E6FAF00E4DFF8 /* Core */, - 62D1AE5B1A1E701B00E4DFF8 /* Validations */, ); name = "Swift-Validator"; sourceTree = ""; @@ -155,30 +147,26 @@ 62D1AE3C1A1E6FAF00E4DFF8 /* Core */ = { isa = PBXGroup; children = ( - 62D1AE531A1E700200E4DFF8 /* ValidationRuleType.swift */, 62D1AE541A1E700200E4DFF8 /* Validator.swift */, 62D1AE451A1E6FF800E4DFF8 /* ValidationError.swift */, - 62D1AE461A1E6FF800E4DFF8 /* ValidationErrorType.swift */, - 62D1AE471A1E6FF800E4DFF8 /* ValidationFactory.swift */, 62D1AE481A1E6FF800E4DFF8 /* ValidationRule.swift */, - 62D1AE441A1E6FF800E4DFF8 /* Validation.swift */, ); name = Core; sourceTree = ""; }; - 62D1AE5B1A1E701B00E4DFF8 /* Validations */ = { + 62DC8D661AAA42700095DFA7 /* Rules */ = { isa = PBXGroup; children = ( - 62D1AE3D1A1E6FEF00E4DFF8 /* FullNameValidation.swift */, - 62D1AE421A1E6FF800E4DFF8 /* PhoneNumberValidation.swift */, - 62D1AE431A1E6FF800E4DFF8 /* RequiredValidation.swift */, - 62D1AE3F1A1E6FF800E4DFF8 /* EmailValidation.swift */, - 62D1AE411A1E6FF800E4DFF8 /* MinLengthValidation.swift */, - 62D1AE401A1E6FF800E4DFF8 /* MaxLengthValidation.swift */, - 62D1AE561A1E700200E4DFF8 /* PasswordValidation.swift */, - 62D1AE551A1E700200E4DFF8 /* ZipCodeValidation.swift */, + 628637251AAA474B00BC8FCF /* MinLengthRule.swift */, + 62DC8D641AAA42520095DFA7 /* Rule.swift */, + 62DC8D691AAA42CE0095DFA7 /* EmailRule.swift */, + 62DC8D6A1AAA42CE0095DFA7 /* RequiredRule.swift */, + 62DC8D6B1AAA42CE0095DFA7 /* PasswordRule.swift */, + 62DC8D671AAA42920095DFA7 /* FullNameRule.swift */, + 62DC8D701AAA43110095DFA7 /* ZipCodeRule.swift */, + 628637271AAA49E300BC8FCF /* ConfirmRule.swift */, ); - name = Validations; + name = Rules; sourceTree = ""; }; /* End PBXGroup section */ @@ -281,23 +269,19 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 62D1AE4C1A1E6FF800E4DFF8 /* PhoneNumberValidation.swift in Sources */, - 62D1AE5A1A1E700200E4DFF8 /* PasswordValidation.swift in Sources */, + 62DC8D681AAA42920095DFA7 /* FullNameRule.swift in Sources */, 62D1AE4F1A1E6FF800E4DFF8 /* ValidationError.swift in Sources */, - 62D1AE3E1A1E6FEF00E4DFF8 /* FullNameValidation.swift in Sources */, - 62D1AE4B1A1E6FF800E4DFF8 /* MinLengthValidation.swift in Sources */, + 62DC8D6E1AAA42CE0095DFA7 /* PasswordRule.swift in Sources */, + 62DC8D6C1AAA42CE0095DFA7 /* EmailRule.swift in Sources */, + 628637281AAA49E300BC8FCF /* ConfirmRule.swift in Sources */, + 62DC8D651AAA42520095DFA7 /* Rule.swift in Sources */, 62D1AE1F1A1E6D4400E4DFF8 /* ViewController.swift in Sources */, - 62D1AE4E1A1E6FF800E4DFF8 /* Validation.swift in Sources */, + 62DC8D6D1AAA42CE0095DFA7 /* RequiredRule.swift in Sources */, 62D1AE1D1A1E6D4400E4DFF8 /* AppDelegate.swift in Sources */, 62D1AE581A1E700200E4DFF8 /* Validator.swift in Sources */, - 62D1AE501A1E6FF800E4DFF8 /* ValidationErrorType.swift in Sources */, - 62D1AE491A1E6FF800E4DFF8 /* EmailValidation.swift in Sources */, - 62D1AE511A1E6FF800E4DFF8 /* ValidationFactory.swift in Sources */, - 62D1AE591A1E700200E4DFF8 /* ZipCodeValidation.swift in Sources */, - 62D1AE571A1E700200E4DFF8 /* ValidationRuleType.swift in Sources */, + 628637261AAA474B00BC8FCF /* MinLengthRule.swift in Sources */, + 62DC8D711AAA43110095DFA7 /* ZipCodeRule.swift in Sources */, 62D1AE521A1E6FF800E4DFF8 /* ValidationRule.swift in Sources */, - 62D1AE4A1A1E6FF800E4DFF8 /* MaxLengthValidation.swift in Sources */, - 62D1AE4D1A1E6FF800E4DFF8 /* RequiredValidation.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Validator.xcodeproj/project.xcworkspace/xcuserdata/jpotts18.xcuserdatad/UserInterfaceState.xcuserstate b/Validator.xcodeproj/project.xcworkspace/xcuserdata/jpotts18.xcuserdatad/UserInterfaceState.xcuserstate index 22363a087da81ee4e049d6a2ec5266096169d74d..b631959a5d0d3aa79f8efb28a8169bc088766bf8 100644 GIT binary patch literal 27069 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 O(}j^goqxyO_WuA^VlLhQ delta 13834 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 IyKD6S0Y>!$EC2ui diff --git a/Validator/Base.lproj/Main.storyboard b/Validator/Base.lproj/Main.storyboard index 38e24b4..c6546d7 100644 --- a/Validator/Base.lproj/Main.storyboard +++ b/Validator/Base.lproj/Main.storyboard @@ -1,7 +1,8 @@ - + - + + @@ -23,11 +24,6 @@ - - - - -