KVC 추가 인증 방법
key
또는 key path
를 통해 속성을 검증하는 방법을 정의합니다.이러한 방법의 기본값은 사용자가 정의한 접근기 방법에 따라 규칙을 명명하는 방법에 의존합니다.구체적으로 말하자면, 당신이 검증하고 싶은 이름key
의 속성에 대해 validate:error:
방법을 제공한다.기본 구현은 키 인코딩 validateValue:forKey:error:
메시지를 통해 검색됩니다.만약 속성의 검증 방법을 제공하지 않는다면, 이 프로토콜의 기본값은 값이 어떻든지 간에 이 속성의 검증이 성공했다고 가정합니다.이것은 당신이 각 속성의 검증을 선택한다는 것을 의미한다.
일반적으로 여기서 설명한 검증은 Objective-C에서만 사용됩니다.Swift에서 속성 검증은 컴파일러와 강력한 형식 검사에 의존하는 지원을 통해 처리되며, 내장된 willSet과didSet 속성 관찰기를 사용하여 실행 시 API를 테스트합니다.관심 있는 학생은 Property Observers In Swift를 볼 수 있습니다.
검증 방법의 실현
하나의 속성에 검증 방법을 제공할 때, 이 방법은 검증할
value
대상과 잘못된 정보를 되돌려 주는 NSError
두 가지 매개 변수로 이루어진다.따라서 검증 방법은 다음 세 가지 작업 중 하나를 수행할 수 있습니다.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
를 설정하기 전에 value
이 nil
인지 아닌지를 검사해야 합니다. 만약에 우리가 검사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
값을 설정하여 error
이 value
인 상황을 처리하고 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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.