Предполагая, что ваши свойства совместимы с Key-Value (как они будут, если вы используете @synthesize), вам также следует реализовать валидаторы, совместимые с Key-Value. Посмотрите на документацию Apple по этому вопросу: http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/Concepts/Validation.html
Важно отметить, что проверка не происходит автоматически, за исключением случаев использования определенных видов привязки. Вы можете позвонить в валидатор напрямую или по телефону validateValue:forKey:error:
.
Вы можете переопределить созданный установщик для вызова валидатора перед его сохранением, но если вы используете привязки, это, вероятно, не то, что вы хотите сделать, так как валидатор, возможно, будет вызываться более одного раза для одной модификации.
Также обратите внимание, что валидатор может изменить проверяемое значение.
Итак, давайте посмотрим на ваш пример (не проверено, кстати. Я не рядом с Mac):
@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, чтобы сделать это.