Ios 目标C验证
我一直在看,发现它很有趣,适合我的情况。特别是验证部分。在我的示例应用程序中,我必须检查团队是否以某种方式组建。检查可以是:Ios 目标C验证,ios,objective-c,Ios,Objective C,我一直在看,发现它很有趣,适合我的情况。特别是验证部分。在我的示例应用程序中,我必须检查团队是否以某种方式组建。检查可以是: 超过4名球员 两女两男 等 到目前为止,我已经创建了这个: @protocol DEXValidator <NSObject> @required - ( BOOL ) validate:(NSError * __autoreleasing *)error; @end //Implements procotol DEXValidator @impleme
- 超过4名球员
- 两女两男
- 等
@protocol DEXValidator <NSObject>
@required
- ( BOOL ) validate:(NSError * __autoreleasing *)error;
@end
//Implements procotol DEXValidator
@implementation DEXValidatorHasFourPlayers
- ( BOOL ) validate:(NSError *__autoreleasing *)error {
if( _team.length != 4 )
*error = ....
return _team.length == 4
}
@end
但我现在的问题是如何将所有N错误返回给调用方。这样我就可以列出团队的问题所在。因为在视频中,他改变了所有表单元素的显示。或者总体上不应该实现验证器协议并做其他事情 您可以使用块语法:
- (void)validateWithCompletionBlock:(void(^)(BOOL success, NSArray *errors))completionBlock {
NSMutableArray *errors = [NSMutableArray new];
if (_team.length != 4){
[errors addObject:[NSError errorWithDomain:@"123" code:123 userInfo:nil]];
}
// perform more checks adding NSErrors to Array
if (completionBlock) {
completionBlock(errors.count == 0, errors.count > 0 ? errors : nil);
}
}
支票看起来像这样:
//Implements procotol DEXValidator
@implementation DEXValidatorTeam
- ( instancetype ) init {
...
_hasfourplayers = [DEXValidatorHasFourPlayers new];
...morechecks...
...
}
- ( BOOL ) validate:(NSError *__autoreleasing *)error {
...
}
[self validateWithCompletionBlock:^(BOOL success, NSArray *errors) {
if (!success) {
// Loop through errors array ....
} else {
// Continue ....
}
}];
- (BOOL)validate:(NSArray *__autoreleasing *)errors {
NSMutableArray *tempErrors = [NSMutableArray new];
if (team.length != 4) {
[tempErrors addObject:[NSError errorWithDomain:@"123" code:123 userInfo:nil]];
}
if (!team.isGenderEqual) {
[tempErrors addObject:[NSError errorWithDomain:@"456" code:456 userInfo:nil]];
}
if (tempErrors.count > 0) {
*errors = [NSArray arrayWithArray:tempErrors];
}
return tempErrors.count == 0;
}
可以使用块语法:
- (void)validateWithCompletionBlock:(void(^)(BOOL success, NSArray *errors))completionBlock {
NSMutableArray *errors = [NSMutableArray new];
if (_team.length != 4){
[errors addObject:[NSError errorWithDomain:@"123" code:123 userInfo:nil]];
}
// perform more checks adding NSErrors to Array
if (completionBlock) {
completionBlock(errors.count == 0, errors.count > 0 ? errors : nil);
}
}
支票看起来像这样:
//Implements procotol DEXValidator
@implementation DEXValidatorTeam
- ( instancetype ) init {
...
_hasfourplayers = [DEXValidatorHasFourPlayers new];
...morechecks...
...
}
- ( BOOL ) validate:(NSError *__autoreleasing *)error {
...
}
[self validateWithCompletionBlock:^(BOOL success, NSArray *errors) {
if (!success) {
// Loop through errors array ....
} else {
// Continue ....
}
}];
- (BOOL)validate:(NSArray *__autoreleasing *)errors {
NSMutableArray *tempErrors = [NSMutableArray new];
if (team.length != 4) {
[tempErrors addObject:[NSError errorWithDomain:@"123" code:123 userInfo:nil]];
}
if (!team.isGenderEqual) {
[tempErrors addObject:[NSError errorWithDomain:@"456" code:456 userInfo:nil]];
}
if (tempErrors.count > 0) {
*errors = [NSArray arrayWithArray:tempErrors];
}
return tempErrors.count == 0;
}
我还没有看到这个视频,所以我可能误解了你的问题。无论如何,您是否可以使用这样一种模式,即返回一个指向包含
NSError
的NSArray
的指针,而不仅仅返回一个NSError
?大概是这样的:
//Implements procotol DEXValidator
@implementation DEXValidatorTeam
- ( instancetype ) init {
...
_hasfourplayers = [DEXValidatorHasFourPlayers new];
...morechecks...
...
}
- ( BOOL ) validate:(NSError *__autoreleasing *)error {
...
}
[self validateWithCompletionBlock:^(BOOL success, NSArray *errors) {
if (!success) {
// Loop through errors array ....
} else {
// Continue ....
}
}];
- (BOOL)validate:(NSArray *__autoreleasing *)errors {
NSMutableArray *tempErrors = [NSMutableArray new];
if (team.length != 4) {
[tempErrors addObject:[NSError errorWithDomain:@"123" code:123 userInfo:nil]];
}
if (!team.isGenderEqual) {
[tempErrors addObject:[NSError errorWithDomain:@"456" code:456 userInfo:nil]];
}
if (tempErrors.count > 0) {
*errors = [NSArray arrayWithArray:tempErrors];
}
return tempErrors.count == 0;
}
你可以这样称呼:
NSArray *errors;
BOOL success = [self validate:&errors];
for (NSError *error in errors) {
NSLog(@"error %@", error);
}
我还没有看到这个视频,所以我可能误解了你的问题。无论如何,您是否可以使用这样一种模式,即返回一个指向包含
NSError
的NSArray
的指针,而不仅仅返回一个NSError
?大概是这样的:
//Implements procotol DEXValidator
@implementation DEXValidatorTeam
- ( instancetype ) init {
...
_hasfourplayers = [DEXValidatorHasFourPlayers new];
...morechecks...
...
}
- ( BOOL ) validate:(NSError *__autoreleasing *)error {
...
}
[self validateWithCompletionBlock:^(BOOL success, NSArray *errors) {
if (!success) {
// Loop through errors array ....
} else {
// Continue ....
}
}];
- (BOOL)validate:(NSArray *__autoreleasing *)errors {
NSMutableArray *tempErrors = [NSMutableArray new];
if (team.length != 4) {
[tempErrors addObject:[NSError errorWithDomain:@"123" code:123 userInfo:nil]];
}
if (!team.isGenderEqual) {
[tempErrors addObject:[NSError errorWithDomain:@"456" code:456 userInfo:nil]];
}
if (tempErrors.count > 0) {
*errors = [NSArray arrayWithArray:tempErrors];
}
return tempErrors.count == 0;
}
你可以这样称呼:
NSArray *errors;
BOOL success = [self validate:&errors];
for (NSError *error in errors) {
NSLog(@"error %@", error);
}
你现在所拥有的是我想要避免的。随着支票数量的增加,此方法将变得更长。这就是为什么我喜欢视频中的显示方式。它在类中分离了几个规则,这给了我一些好处代码>到
完成块(errors.count==0,errors.count>0?errors:nil)代码>。否则,有人可能会检查errors数组是否为nil,并且总是会得到它是否存在。您现在拥有的是我想要避免的东西。随着支票数量的增加,此方法将变得更长。这就是为什么我喜欢视频中的显示方式。它在类中分离了几个规则,这给了我一些好处代码>到完成块(errors.count==0,errors.count>0?errors:nil)代码>。否则,可能有人会检查错误数组是否为nil
,并始终会得到它是否存在。创建一个具有mutableArray属性的全局类,然后将所有错误存储在那里。创建一个具有mutableArray属性的全局类,然后将所有错误存储在那里。