가정 당신의 재산을 준수 키 - 값입니다 당신은 또한 키 - 값을 준수 유효성 검사기를 구현해야합니다 (당신이 @synthesize를 사용하는 경우가 될 것 같은). 이 문제에 관한 Apple의 문서를 살펴보십시오. http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/Concepts/Validation.html
중요 사항은 특정 종류의 바인딩을 사용하는 경우를 제외하고 유효성 검사가 자동으로 수행되지 않는다는 것입니다. 유효성 검사기에 직접 전화 하시거나 validateValue:forKey:error:
으로 전화하십시오.
저장하기 전에 생성자를 호출하기 위해 유효성 검사기를 호출 할 수 있지만 바인딩을 사용하는 경우 유효성 검사기가 단일 수정에 대해 두 번 이상 호출 될 수 있기 때문에 원하는 작업이 아닐 수 있습니다.
또한 유효성 검사기는 유효성을 검사하는 값을 변경할 수 있습니다.
그럼 예제 (테스트되지 않은, btw.내가) 맥 근처에 아니에요 :
@implementation MyClass
@synthesize myValue;
-(BOOL)validateMyValue:(id *)ioValue error:(NSError **)outError
{
if (*ioValue == nil) {
// trap this in setNilValueForKey
// alternative might be to create new NSNumber with value 0 here
return YES;
}
if ([*ioValue intValue] < 0) {
NSString *errorString = @"myValue must be greater than zero";
NSDictionary *userInfoDict = [NSDictionary dictionaryWithObject:errorString
forKey:NSLocalizedDescriptionKey];
NSError *error = [[[NSError alloc] initWithDomain:@"MyValueError"
code:0
userInfo:userInfoDict] autorelease];
*outError = error;
return NO;
} else {
return YES;
}
}
당신이 합성 세터를 무시하고 검증 (아직 검증되지 않은) 할 수 있도록하고 싶었다면 :
- (void)setMyValue:(int)value {
id newValue = [NSNumber numberWithInt:value];
NSError *errorInfo = nil;
if ([self validateMyValue:&newValue error:&errorInfo]) {
myValue = [newValue intValue];
}
}
당신은 볼 수 우리는 포장했다 NSNumber 인스턴스의 정수.
'코코아'및 'macosx'로 태그 지정하는 것이 좋습니다. 나는 그것에 대한 명성이 충분히 높지 않다. – toholio