KVC 추가 인증 방법

4197 단어
KVC 프로토콜은 key 또는 key path를 통해 속성을 검증하는 방법을 정의합니다.이러한 방법의 기본값은 사용자가 정의한 접근기 방법에 따라 규칙을 명명하는 방법에 의존합니다.구체적으로 말하자면, 당신이 검증하고 싶은 이름key의 속성에 대해 validate:error: 방법을 제공한다.기본 구현은 키 인코딩 validateValue:forKey:error: 메시지를 통해 검색됩니다.
만약 속성의 검증 방법을 제공하지 않는다면, 이 프로토콜의 기본값은 값이 어떻든지 간에 이 속성의 검증이 성공했다고 가정합니다.이것은 당신이 각 속성의 검증을 선택한다는 것을 의미한다.
일반적으로 여기서 설명한 검증은 Objective-C에서만 사용됩니다.Swift에서 속성 검증은 컴파일러와 강력한 형식 검사에 의존하는 지원을 통해 처리되며, 내장된 willSet과didSet 속성 관찰기를 사용하여 실행 시 API를 테스트합니다.관심 있는 학생은 Property Observers In Swift를 볼 수 있습니다.

검증 방법의 실현


하나의 속성에 검증 방법을 제공할 때, 이 방법은 검증할 value 대상과 잘못된 정보를 되돌려 주는 NSError 두 가지 매개 변수로 이루어진다.따라서 검증 방법은 다음 세 가지 작업 중 하나를 수행할 수 있습니다.
  • 객체가 유효한 경우 YES로 돌아가거나(변경되지 않음value 또는value
  • error 객체가 잘못되었을 때 유효한 대체 방법을 제공하지 못하거나 원하지 않을 경우 매개변수 value 를 실패 원인을 나타내는 NSError 객체로 설정하고 NO 로 돌아갑니다.
    IMPORTANT
    설정error 전에 테스트가 필요합니다error 파라미터가 아닌 경우error
  • 대상이 무효일 때 유효한 대체 방법을 알고 있습니다. 유효한 대상을 만들고 NULL 인용을 새로운 대상에 지정하고 YES로 되돌려줍니다.만약 당신이 다른 value 를 제공한다면, 원시 대상이 가변적이라 하더라도, 검증 중인 대상을 수정하지 않고 항상 새로운 대상을 되돌려줍니다.

  • 다음 코드는 value 속성의 검증 방법을 보여 줍니다. 이 방법은 error 이 아닌 value 속성을 확보하고 이름은 최소 길이가 있습니다.검증에 실패하면 이 방법은 다른 값으로 대체되지 않습니다.
    - (BOOL)validateName:(id *)ioValue error:(NSError * __autoreleasing *)outError{
        if ((*ioValue == nil) || ([(NSString *)*ioValue length] < 2)) {
            if (outError != NULL) {
                *outError = [NSError errorWithDomain:PersonErrorDomain
                                                code:PersonInvalidNameCode
                                            userInfo:@{ NSLocalizedDescriptionKey
                                                        : @"Name too short" }];
            }
            return NO;
        }
        return YES;
    }
    

    위에서 말했듯이 name 를 설정하기 전에 valuenil 인지 아닌지를 검사해야 합니다. 만약에 우리가 검사error가 아니라 직접 설정error을 한다면 다음과 같습니다.
    - (BOOL)validateName:(id *)ioValue error:(NSError * __autoreleasing *)outError{
        if ((*ioValue == nil) || ([(NSString *)*ioValue length] < 5)) {
            NSErrorDomain PersonErrorDomain = NSCocoaErrorDomain;
            NSInteger PersonInvalidNameCode = 10086;
          //  error `NULL`
            *outError = [NSError errorWithDomain:PersonErrorDomain
                                            code:PersonInvalidNameCode
                                        userInfo:@{ NSLocalizedDescriptionKey
                                                    : @"Name too short" }];
            return NO;
        }
        return YES;
    }
    

    검사 방법 호출
        Person* person = [[Person alloc] init];
        NSString* name = @"A";
        
        BOOL validation = [person validateValue:&name forKey:@"name" error: nil];
        if (validation) {
            [person setValue:name forKey:@"name"];
        }
    

    이때 야생 지침을 던진다.
    Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)

    기본 데이터 변수의 검증


    유효성 검사 방법에서는 매개변수가 객체일 것으로 예상하므로 이 글에서 설명한 것처럼 객체가 아닌 속성의 값은 NSValue 또는 NSNumber 객체에 포함됩니다.표11-2의 예는 기본 데이터 변수NULL의 검증 방법을 보여 준다.이 경우 유효한 error 값을 설정하여 errorvalue 인 상황을 처리하고 YES로 돌아갑니다.우리도 age 방법에서 이런 상황을 처리할 수 있다. 왜냐하면 때때로 우리는 검증 방법을 호출하지 않기 때문이다.
    예:
    - (BOOL)validateAge:(id *)ioValue error:(NSError * __autoreleasing *)outError {
        if (*ioValue == nil) {
            // Value is nil: Might also handle in setNilValueForKey
            *ioValue = @(0);
        } else if ([*ioValue floatValue] < 0.0) {
            if (outError != NULL) {
                *outError = [NSError errorWithDomain:PersonErrorDomain
                                                code:PersonInvalidAgeCode
                                            userInfo:@{ NSLocalizedDescriptionKey
                                                        : @"Age cannot be negative" }];
            }
            return NO;
        }
        return YES;
    }
    

    좋은 웹페이지 즐겨찾기