简化的 Objective-C 对象验证。
目前可用的默认验证器
- 存在验证器
- 字符串长度验证器
- email 验证器
您只需将 REValidation
文件放入项目中,并在将使用它的类的顶部添加 #include "REValidation.h"
。
[REValidation registerDefaultValidators];
[REValidation registerDefaultErrorMessages];
NSString *emailString = @"test#@example.com";
NSArray *errors = [REValidation validateObject:emailString name:@"Email" validators:@[ @"presence", @"length(3, 20)", @"email" ]];
for (NSError *error in errors)
NSLog(@"Error: %@", error.localizedDescription);
// Alternatively you can use REValidator instances
//
NSString *testString = @"";
errors = [REValidation validateObject:testString name:@"Test string" validators:@[ [REPresenceValidator validator], [RELengthValidator validatorWithParameters:@{ @"min": @3, @"max": @10}] ]];
for (NSError *error in errors)
NSLog(@"Error: %@", error.localizedDescription);
易于实现自定义验证器,您需要从 REValidator
继承并实现三个方法
+ (NSString *)name;
+ (NSDictionary *)parseParameterString:(NSString *)string;
+ (NSError *)validateObject:(NSString *)object variableName:(NSString *)name parameters:(NSDictionary *)parameters;
例如
+ (NSString *)name
{
return @"length";
}
+ (NSDictionary *)parseParameterString:(NSString *)string
{
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(\\d+)" options:0 error:&error];
NSArray *matches = [regex matchesInString:string options:0 range:NSMakeRange(0, string.length)];
NSMutableArray *results = [NSMutableArray array];
for (NSTextCheckingResult *matchResult in matches) {
NSString *match = [string substringWithRange:[matchResult range]];
[results addObject:match];
}
if (results.count == 2) {
return @{ @"min": results[0], @"max": results[1]};
}
return nil;
}
+ (NSError *)validateObject:(NSString *)object variableName:(NSString *)name parameters:(NSDictionary *)parameters
{
NSUInteger minimumValue = [parameters[@"min"] integerValue];
NSUInteger maximumValue = [parameters[@"max"] integerValue];
if (object.length < minimumValue && minimumValue > 0)
return [NSError re_validationErrorForDomain:@"com.REValidation.minimumLength", name, minimumValue];
if (object.length > maximumValue && maximumValue > 0)
return [NSError re_validationErrorForDomain:@"com.REValidation.maximumLength", name, maximumValue];
return nil;
}
不继承 REValidator
类,也可以使用内联验证添加验证。以下是如何使用内联验证与 RETableViewManager 一起使用的示例
REValidator *nameValidator = [REValidator validator];
nameValidator.inlineValidation = ^NSError *(NSString *string, NSString *name) {
if ([string componentsSeparatedByString:@" "].count < 2) {
return [NSError errorWithDomain:@"" code:0 userInfo:@{NSLocalizedDescriptionKey: @"Please enter first and last name."}];
}
return nil;
};
RETextItem *nameItem = [RETextItem itemWithTitle:@"" value:self.contact.name placeholder:@"First & Last Name"];
nameItem.autocapitalizationType = UITextAutocapitalizationTypeWords;
nameItem.validators = @[nameValidator];
Roman Efimov
REValidation 可在 MIT 许可证下使用。
版权 © 2013 Roman Efimov。
特此授予任何获取本软件及其相关文档文件(以下简称“软件”)的副本的人,免费、不可撤销的使用本软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本,并允许获取本软件的人这样做,前提是
上述版权声明和本许可声明应包含在软件的所有副本或实质性部分中。
软件按“现状”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定用途适用性和非侵权性保证。在任何情况下,作者或版权所有者不对因 Software 或其使用或其它交易而产生的任何索赔、损害或其他责任负责,无论是基于合同、侵权或其他法律适用。