Assumendo le proprietà sono valore-chiave compatibile (come lo sarebbero se si utilizza @synthesize) si dovrebbe anche implementare chiave-valore validatori compliant. Dai un'occhiata alla documentazione Apple in merito: http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/Concepts/Validation.html
La cosa importante da notare è che la convalida non avviene automaticamente tranne quando si utilizzano determinati tipi di rilegatura. Puoi chiamare direttamente il validatore o chiamando lo validateValue:forKey:error:
.
È possibile sovrascrivere il setter prodotto per chiamare il validatore prima di salvarlo, ma se si utilizzano i collegamenti, questo probabilmente non è ciò che si vuole fare poiché il validatore verrà chiamato più volte per una singola modifica.
Si noti inoltre che il validatore potrebbe modificare il valore da convalidare.
Quindi guardiamo il tuo esempio (non testato, btw.Io non sono in prossimità di un 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;
}
}
Se si volesse ignorare il setter sintetizzato e fargli fare la validazione (ancora non testata):
- (void)setMyValue:(int)value {
id newValue = [NSNumber numberWithInt:value];
NSError *errorInfo = nil;
if ([self validateMyValue:&newValue error:&errorInfo]) {
myValue = [newValue intValue];
}
}
Si può vedere abbiamo dovuto avvolgere il intero in un'istanza NSNumber per farlo.
Probabilmente vale la pena contrassegnarlo con "cacao" e "macosx". Non ho una reputazione abbastanza alta per questo. – toholio