Objective-C Model Validator is a collection of classes and categories to add easy model validation to your application.
This project is inspired from the famous ActiveRecord Ruby framework.
Validation in Objective-C requires some effort to do and I needed it hardly. Knowing ActiveRecord made me do this.
Import using cocoapods
pod 'ObjcModelValidation', '~> 0.2'
#import "ValidationModel.h"
@interface SampleModel : ValidationModel
@property (nonatomic, strong) NSString *nameString;
@property (nonatomic, strong) NSNumber *ageNumber;
@end
Note that it inherits from ValidationModel.
All properties used in this model are used to validate depending on their class.
#import "SampleModel.h"
@implementation SampleModel
-(NSError *)validateAgeNumber:(NSNumber *)ageNumber{
if ([ageNumber greaterThan:@18] && [ageNumber presence]) {
return nil;
}
return [self errorWithLocalizedMessage:NSLocalizedString(@"You should be older than 18.", @"")];
}
-(NSError *)validateNameString:(NSString *)nameString{
if ([nameString lengthMin:4]) {
return nil;
}
return [self errorWithLocalizedMessage:NSLocalizedString(@"Your name should be at least 4 characters long", @"")];
}
@end
Note how the syntax of each validation method is: -(NSError *)validate<CapitalizedVariableName>:(<VariableClass> *)<variableName>;
This only works for objects at the moment. So if you store NSInteger
or BOOL
anywhere use NSNumber
instead.
To start validating your models create them and save. Each model has its own save method, which returns a NSArray
containing NSError
objects.
Example:
SampleModel *sample = [[SampleModel alloc] init];
sample.nameString = @"Piet";
sample.ageNumber = @22;
NSArray *errors = [sample save];
if (errors.count != 0) {
PBLog(@"I got some errors here.");
for (NSError *error in errors) {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:error.localizedDescription delegate:nil cancelButtonTitle:@"Hide" otherButtonTitles:nil];
[alertView show];
}
}
Note when overriding save
you have to call [super save];
. Otherwise validations are not called.
If everything fits you will see a log in the console.
Checks for value to exist or not.
This method should be overriden by other validation classes to get specific presence validation for a class.
-(BOOL)presence;
Checks for the speicified method and executes custom validation.
-(BOOL)validatesWithSelector:(SEL)selector;
Checks if the referenceNumber is greater than self
-(BOOL)greaterThan:(NSNumber *)referenceNumber;
Checks if the referenceNumber is smaller than self
-(BOOL)lessThan:(NSNumber *)referenceNumber;
Takes an array of strings and searches for it in self.
Returns YES if strings where not found in string.
-(BOOL)exclusion:(NSArray *)exclusionArray;
Takes an regex string and validates it.
-(BOOL)format:(NSString *)regexExpression;
Takes an array of strings and searches for it in self.
Returns YES if strings was found in string.
-(BOOL)inclusion:(NSArray *)inclusionArray;
Validates with minimum length
-(BOOL)lengthMin:(NSInteger)length;
Validates with maximum length
-(BOOL)lengthMax:(NSInteger)length;
Validates with range
-(BOOL)lengthIn:(NSInteger)lengthMin and:(NSInteger)lengthMax;
Validates with exact range
-(BOOL)lengthIs:(NSInteger)length;
Validates with if the string consists only of numbers
-(BOOL)numericality;
Fork the Repository, write a test and send a pull request.