Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 目标C验证_Ios_Objective C - Fatal编程技术网

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属性的全局类,然后将所有错误存储在那里。